Como você deve saber, o Spotlight pode fazer matemática simples. Por exemplo, a digitação cos(pi)
resultará em -1
, como você poderia esperar. Eu apenas digitei cos(pi/2)
, que deveria ser 0, mas isso me deu -5e-12
.
Sim, é provavelmente devido a um erro de arredondamento, mas vamos lá cos(pi/2)
:! Na minha opinião, isso claramente parece bug. O que você acha?
pi
em si seria codificado (à medida que você obtém -1cos(pi)
), mas assim que você o manipula, obtém um número de ponto flutuante, que tem precisão limitada. OSX não codificapi/2
,pi/4
etc, ele realmente faz a operação.0.1
exatamente. precisamente, mas não é útil para números irracionais como pi, que não podem ser representados exatamente em binário ou decimal.irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
Respostas:
Isso se deve à falta de precisão do pi e à falta geral de precisão no sistema interno.
Sobre a precisão geral do sistema:
No Python, temos o seguinte:
Como podemos ver, há um problema com a precisão, pois ela nem sequer corresponde à representação de flutuação.
fonte
Eles não estão armazenando π com precisão incomum de ponto flutuante. Eles estão usando um valor incorreto para π com precisão dupla. Para aproximar 3,1415926536 em binário, são necessários pelo menos 38 bits:
Observe que 2 ^ -36 é aproximadamente 1,5e-11, o que coincide com o 99 final. O ponto flutuante de precisão dupla tem um significando de 52 bits. Para avaliar
cos(pi/2)
como -5e-12, a única outra opção possível seria um tipo de 48 bits, o que seria muito estranho.Perto de 0 e π, onde a derivada é quase zero, cos (θ) não pode ser calculado com muita precisão:
cos(3.1415926536) ≈ -0.999999999999999999999947911
Isso difere de -1 em cerca de 5,2e-23, que é menor que ε para
double
, entãocos(3.1415926536)
é calculado exatamente como -1 ... o que está incorreto.Perto de ± π / 2, a derivada [ -sin (θ) ] é quase ± 1, portanto o erro na entrada se torna a saída.
Por acaso, tenho uma calculadora de TI que exibe um dígito a menos e calcula
cos(π/2)
como -5.2e-12. No entanto, é muito diferente eletronicamente e foi projetado para fornecer um valor exato paracos(90°)
.Suponho que, no Spotlight,
cos(pi/2)
esteja sendo calculado recuperando um valor para π, convertendo para uma sequência decimal , armazenando-o como o valor binário (exato, racional) 11.001001000011111101101010100010001001000010011101111 (ou 10000), dividindo por 2 e depois subtraindo-o de o valor verdadeiro de π / 2. Você deve descobrir secos(pi/2 + cos(pi/2))
está mais perto de zero (pode ser -2,2e-35).A multiplicação por uma potência de dois deve afetar apenas o expoente, não o significando. Pode ser possível determinar como o arredondamento é aplicado pela metade ou duplicação repetidas.
fonte
É um bug reproduzível na versão 10.9.2 - e um erro de arredondamento de ponto flutuante como esse é bastante típico.
É o valor de pi que está sendo tratado sem precisão suficiente, se eu tivesse que adivinhar.
Eu diria para https://developer.apple.com/bug-reporting/ se você quiser ver o aparelho de correção de bugs da Apple em ação.
fonte
cos(2*acos(0)*0.5)
retorna um número de pedido10^-10
. Portanto, não é porque a constante π não seja suficientemente precisa. Não posso explicar esse resultado: é impreciso demais para precisão dupla e muito preciso para precisão única.Das outras respostas e comentários, fica claro o seguinte:
O fato de você obter um resultado diferente de zero NÃO é um erro, mesmo com uma implementação perfeita do software, você se depararia com os limites dos cálculos de ponto flutuante. No entanto, o erro da ordem de 10 ^ -12 é realmente grande.
Isso NÃO é o culpado pela imprecisão dos números de ponto flutuante. O resultado obtido é exatamente este:
Isso pode ser validado usando qualquer pacote de software alternativo. Se você avaliar
cos(pi/2)
em um desses pacotes, obterá definitivamente um resultado muito mais próximo de zero do que 10 ^ -12.Para concluir, vejo duas possíveis limitações, uma das quais deve ser aplicada:
Talvez alguém com acesso ao software possa validar qual deles se aplica.
Atualização Conforme mencionado no comentário, o problema parece ser a precisão da constante
pi
.fonte
Considerando que
-5e-12
é um número muito pequeno, esse é um erro de arredondamento.Eu acho que é a conseqüência do spotlight mostrar mais casas decimais do que as usadas na definição da
pi
constante ou da série infinita usada para calcular as funções trigonométricas.fonte