9 votes

Pourquoi Spotlight donne-t-il une valeur erronée pour `cos(pi/2)` ?

Comme vous le savez peut-être, Spotlight peut faire des mathématiques simples. Par exemple, en tapant cos(pi) aura pour résultat -1 comme on peut s'y attendre. J'ai juste tapé cos(pi/2) qui devrait être 0, mais j'ai obtenu -5e-12 .

Oui, c'est probablement dû à une erreur d'arrondi, mais allons-y : cos(pi/2) ! A mon avis, cela ressemble clairement à un bug. Qu'en pensez-vous ?

13voto

Matthieu Riegler Points 20160

C'est dû au manque de précision de pi et au manque général de précision du système intégré.

pi = 3.1415926536

pi/2 = 1.5707963268 

cos(1.5707963268) = -5.103412e-12

FYI =  5.103412e-12 = 0.000000000005103412 ~ 0 

À propos de la précision globale du système :

3.141592653589793238462643383 = 3.1415926536 

En Python, nous obtenons ce qui suit :

>>> float("3.141592653589793238462643383")
3.141592653589793

Comme nous pouvons le voir, il y a un problème avec la précision puisqu'elle ne correspond même pas à la représentation du flottant.

5voto

manu08 Points 1572

Ils ne sont pas stockés avec une précision inhabituelle en virgule flottante. Ils utilisent une valeur incorrecte pour la double précision. Pour approximativement 3.1415926536 en binaire, au moins 38 bits sont nécessaires :

3.14159265359922… > 11.001001000011111101101010100010001001

Remarquez que 2^-36 est environ 1.5e-11, ce qui coïncide avec le 99 qui suit. Virgule flottante à double précision a un significande de 52 bits. Pour évaluer cos(pi/2) comme -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

La différence avec -1 est d'environ 5,2e-23, ce qui est plus faible que pour double donc cos(3.1415926536) est calculé comme suit exactement -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.

cos(1.57079632679961)  -4.71338076867830836e-12
cos(1.57079632679962)  -4.72338076867830836e-12
cos(1.57079632680000)  -5.10338076867830836e-12

Il se trouve que j'ai une calculatrice TI qui affiche un chiffre en moins et calcule cos(/2) comme -5.2e-12. Cependant, il est très différent électroniquement et a été conçu pour donner une valeur exacte de cos(90°) .

Je suppose que dans Spotlight, cos(pi/2) est calculé en récupérant une valeur pour , conversion en chaîne décimale en le stockant sous la forme de la valeur binaire (exacte, rationnelle) 11.001001000011111101101010001000100100001101101111 (ou 10000), en le divisant par 2, puis en le soustrayant essentiellement de la valeur valeur réelle de /2. Vous devez déterminer si cos(pi/2 + cos(pi/2)) est plus proche de zéro (il pourrait être de -2,2e-35).

La multiplication par une puissance de deux ne devrait affecter que l'exposant, pas le significande. Il pourrait être possible de déterminer comment l'arrondi est appliqué en divisant par deux ou par deux de manière répétée.

4voto

Oskar Points 1242

C'est un bogue reproductible sous 10.9.2 - et une erreur d'arrondi en virgule flottante comme celle-ci est tout à fait typique.

C'est la valeur de pi qui est manipulée sans assez de précision si je devais deviner.

  • cos(999999*pi) ne comporte pas d'erreur
  • cos((999999+1)*pi) a une erreur - probablement un arrondi

Je me dirigeais vers https://developer.apple.com/bug-reporting/ si vous voulez voir l'appareil de correction des bugs d'Apple en action.

4voto

Dennis Jaheruddin Points 161

Les autres réponses et commentaires font ressortir les points suivants :

Le fait que vous obteniez un résultat non nul n'est PAS un bogue. Même avec une mise en œuvre parfaite du logiciel, vous vous heurteriez aux limites des calculs en virgule flottante. Cependant, une erreur de l'ordre de 10^-12 est vraiment importante.

Cela n'est PAS dû à l'imprécision des nombres à virgule flottante. Le résultat que vous obtenez est juste ceci :

cos(1.5707963268)

Cela peut être validé en utilisant n'importe quel logiciel alternatif. Si vous deviez évaluer cos(pi/2) dans un de ces paquets, 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 :

  1. Pi n'est pas stocké avec une précision suffisante, ou au moins pi/2 résulte en une précision insuffisante
  2. Cos prend simplement une précision insuffisante en entrée

Peut-être que quelqu'un ayant accès au logiciel peut valider ce qui s'applique.

Mise à jour Comme mentionné dans le commentaire, le problème semble être la précision de la constante. pi .

2voto

Mike Points 1018

Considérant que -5e-12 est un très petit nombre, ce es une erreur d'arrondi.

Je pense que c'est la conséquence du fait que le projecteur montre plus de décimales que celles utilisées dans la définition de l'indice. pi constante ou la série infinie utilisée pour calculer les fonctions trigonométriques.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X