Comme vous le savez peut-être, Spotlight peut faire des mathématiques simples. Par exemple, la saisie cos(pi)
entraînera -1
, comme vous pouvez vous y attendre. Je viens de taper cos(pi/2)
, ce qui devrait être 0 mais ça m'a donné -5e-12
.
Oui, c'est probablement dû à une erreur d'arrondi, mais allez cos(pi/2)
:! À mon avis, cela ressemble clairement à un bug. Qu'est-ce que tu penses?
pi
lui-même serait codé en dur (car vous obtenez -1 pourcos(pi)
) mais dès que vous le manipulez, vous obtenez un nombre à virgule flottante, qui a une précision limitée. OSX ne code pas en durpi/2
,pi/4
etc., il fait réellement l'opération.0.1
exactement. précisément, mais ce n'est pas utile pour les nombres irrationnels comme pi qui ne peuvent pas être représentés exactement en binaire ou décimal.irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
Réponses:
Cela est dû au manque de précision de pi et au manque global de précision dans le système intégré.
À propos de la précision globale du système:
En Python, nous obtenons ce qui suit:
Comme nous pouvons le voir, il y a un problème avec la précision car elle ne correspond même pas à la représentation flottante.
la source
Ils ne stockent pas π avec une précision inhabituelle en virgule flottante. Ils utilisent une valeur incorrecte pour π avec une double précision. Pour approximer 3,1415926536 en binaire, au moins 38 bits sont requis:
Notez que 2 ^ -36 est d'environ 1,5e-11, ce qui coïncide avec le 99 de fin. La virgule flottante double précision a une signification de 52 bits. Pour évaluer
cos(pi/2)
-5e-12, le seul autre choix possible serait un type 48 bits, ce qui serait très étrange.Près de 0 et π, où la dérivée est presque nulle, cos (θ) ne peut pas être calculé très précisément:
cos(3.1415926536) ≈ -0.999999999999999999999947911
Cela diffère de -1 d'environ 5,2e-23, ce qui est inférieur à ε pour
double
,cos(3.1415926536)
est donc calculé exactement comme -1 ... ce qui est incorrect.Près de ± π / 2, la dérivée [ -sin (θ) ] est proche de ± 1, donc l'erreur à l'entrée devient la sortie.
Il se trouve que j'ai une calculatrice TI qui affiche un chiffre de moins et calcule
cos(π/2)
-5,2e-12. Cependant, il est très différent électroniquement et a été conçu pour donner une valeur exacte pourcos(90°)
.Je suppose que dans Spotlight,
cos(pi/2)
est calculé en récupérant une valeur pour π, en la convertissant en une chaîne décimale , en la stockant en tant que valeur binaire (exacte, rationnelle) 11,00100100001111110110101010001000100100001101101111 (ou 10000), en divisant par 2, puis en soustrayant essentiellement celle de la vraie valeur de π / 2. Vous devriez savoir s'ilcos(pi/2 + cos(pi/2))
est plus proche de zéro (il pourrait être -2,2e-35).La multiplication par une puissance de deux ne devrait affecter que l'exposant, pas la signification. Il pourrait être possible de déterminer comment l'arrondi est appliqué en réduisant ou en doublant de façon répétée.
la source
C'est un bogue reproductible sur 10.9.2 - et une erreur d'arrondi à virgule flottante comme celle-ci est assez typique.
C'est la valeur de pi qui est gérée sans assez de précision si je devais deviner.
Je me dirigerais vers https://developer.apple.com/bug-reporting/ si vous voulez voir l'appareil de correction de bogues d'Apple en action.
la source
cos(2*acos(0)*0.5)
renvoie un certain nombre de commande10^-10
. Ce n'est donc pas parce que la constante π n'est pas assez précise. Je ne peux pas expliquer ce résultat: c'est trop imprécis pour la double précision et trop précis pour la simple précision.À partir des autres réponses et commentaires, les éléments suivants deviennent clairs:
Le fait que vous obteniez un résultat différent de zéro n'est PAS un bug, même avec une implémentation parfaite du logiciel, vous courriez dans les limites des calculs en virgule flottante. Cependant, l'erreur de l'ordre de 10 ^ -12 est vraiment importante.
Ce n'est PAS à blâmer pour l'inexactitude des nombres à virgule flottante. Le résultat que vous obtenez est juste ceci:
Cela peut être validé à l'aide de tout autre logiciel. Si vous deviez évaluer
cos(pi/2)
dans l'un de ces packages, vous obtiendrez certainement un résultat beaucoup plus proche de zéro que 10 ^ -12.Pour conclure, je vois deux limitations possibles, dont l'une doit s'appliquer:
Peut-être qu'une personne ayant accès au logiciel peut valider laquelle s'applique.
Mise à jour Comme mentionné dans le commentaire, le problème semble être la précision de la constante
pi
.la source
Étant donné qu'il
-5e-12
s'agit d'un nombre très réduit, il s'agit d' une erreur d'arrondi.Je pense que c'est la conséquence du projecteur montrant plus de décimales que celles utilisées dans la définition de la
pi
constante ou de la série infinie utilisée pour calculer les fonctions trigonométriques.la source