Pourquoi Spotlight donne-t-il une mauvaise valeur pour «cos (pi / 2)»?


8

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?


1
cos (x) est une fonction transcendantale. À moins qu'ils ne codent en dur les valeurs de pi, pi / 2, etc., vous devez vous attendre à une erreur.
Navin

@Navin, en fait, je m'attends à ce qu'ils codent en dur ces valeurs car elles sont très importantes.
poitroae

1
pilui-même serait codé en dur (car vous obtenez -1 pour cos(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 dur pi/2, pi/4etc., il fait réellement l'opération.
harryg

2
@harryg Bien qu'il existe des erreurs d'arrondi qui peuvent être résolues en passant à la décimale, ce n'est pas l'une d'entre elles. Décimal est utile si vous souhaitez représenter 0.1exactement. 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.
CodesInChaos

1
Pour référence, dans Ruby:irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
harryg

Réponses:


13

Cela est dû au manque de précision de pi et au manque global de précision dans le 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 car elle ne correspond même pas à la représentation flottante.


Cela est dû au manque de précision, mais une erreur de cette ampleur ne peut pas être décriée sur les nombres à virgule flottante.
Dennis Jaheruddin

2
C'est probablement plus un manque de précision avec la valeur pi.
Matthieu Riegler

5

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:

3.14159265359922… > 11.001001000011111101101010100010001001

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.

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 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 pour cos(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'il cos(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.


Il n'y a rien de mal avec le Markdown - MathJax n'est activé que sur les sites liés aux mathématiques, pas à l'échelle du SE.
grg

1
cos (pi / 2 + cos (pi / 2)) s'affiche exactement à 0.
Nick Matteo

4

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.

  • cos (999999 * pi) n'a pas d'erreur
  • cos ((999999 + 1) * pi) contient une erreur - arrondi probable

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


5
Est-ce vraiment un bug? Quelle devrait être la précision d'une telle opération?
Édouard

Je ne suis pas un développeur enregistré, mais je vous serais très reconnaissant de bien vouloir nous le soumettre!
poitroae

4
@ Édouard Vous pourriez considérer cela comme un bug si l'utilisateur a été amené à s'attendre à des capacités de mathématiques symboliques. Tout système d'algèbre informatique (CAS) saura bien sûr que cos (π / 2) = 0 exactement! D'un autre côté, il n'est guère raisonnable de s'attendre à ce que Spotlight contienne un CAS. Et dans le domaine de l'arithmétique à virgule flottante, des résultats comme les rapports OP sont à prévoir. Tout rapport de bogue pourrait être mieux étiqueté comme une demande de fonctionnalité, peut-être.
Harald Hanche-Olsen

1
@ Édouard bmike a en fait raison de dire qu'il s'agit d'un bug et pas seulement d'une erreur d'arrondi. La précision attendue d'une telle opération, étant donné l'arithmétique standard à double précision, est d'environ 10 ^ -16, et non 10 ^ -12. Vous pouvez l'essayer vous-même en écrivant un programme dans votre langue préférée qui tire parti de la prise en charge des virgules flottantes du processeur, en effectuant le calcul et en examinant la configuration binaire du résultat. Comme le dit bmike, la raison probable est que la valeur π utilisée par Spotlight n'est pas définie avec une précision suffisante.
Szabolcs

2
Quelque chose de bizarre se passe ici. cos(2*acos(0)*0.5)renvoie un certain nombre de commande 10^-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.
Szabolcs

4

À 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:

cos(1.5707963268)

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:

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

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.


C'est bizarre. 1.5707963268 est le résultat que Spotlight vous donne lorsque vous calculez pi / 2. Après quelques essais simples, il semble que Spotlight affiche 10 chiffres significatifs pour le nombre inférieur à 1 et 11 pour les nombres supérieurs à 1. Mais pour quelle étrange raison d'implémentation, une étape d'arrondi serait-elle appliquée à l' intérieur du calcul plutôt qu'après?
Édouard

1
Je voulais également souligner que si vous fournissez à Spotlight une approximation plus précise pi / 2 (en copiant-collant plus de 10 chiffres de Wolfram Alpha, par exemple), la précision augmente.
Édouard

Merci d'avoir confirmé ma supposition que la précision de pi était la cause de l'erreur entre 0 et environ 10 ^ -12 dans la question de l'OP.
bmike

Combien de fois voyez-vous ceci: "10 ^ -12 est vraiment grand"
GEdgar

2

Étant donné qu'il -5e-12s'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 piconstante ou de la série infinie utilisée pour calculer les fonctions trigonométriques.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.