Warum gibt Spotlight einen falschen Wert für "cos (pi / 2)" an?


8

Wie Sie vielleicht wissen, kann Spotlight einfache Mathematik ausführen. Wenn Sie beispielsweise tippen, cos(pi)führt dies -1erwartungsgemäß dazu. Ich habe gerade eingegeben cos(pi/2), was 0 sein sollte, aber es gab mir -5e-12.

Ja, es liegt wahrscheinlich an einem Rundungsfehler, aber komm schon : cos(pi/2)! Meiner Meinung nach sieht das eindeutig nach einem Fehler aus. Was denken Sie?


1
cos (x) ist eine transzendentale Funktion. Wenn sie keine Hardcode-Werte für pi, pi / 2 usw. haben, sollten Sie mit einem Fehler rechnen.
Navin

@Navin Eigentlich erwarte ich, dass sie diese Werte hart codieren, da sie sehr wichtig sind.
Poitroae

1
piselbst wäre fest codiert (wenn Sie -1 für erhalten cos(pi)), aber sobald Sie es manipulieren, erhalten Sie eine Gleitkommazahl, die eine begrenzte Genauigkeit hat. OSX nicht schwer Code pi/2, pi/4etc, es macht tatsächlich die Operation.
Harryg

2
@harryg Es gibt zwar Rundungsfehler, die durch Umschalten auf Dezimalzahl behoben werden können, dies ist jedoch keiner von ihnen. Dezimal ist nützlich, wenn Sie 0.1genau darstellen möchten . genau, aber es ist nicht nützlich für irrationale Zahlen wie pi, die weder binär noch dezimal genau dargestellt werden können.
CodesInChaos

1
Als Referenz in Ruby:irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
Harryg

Antworten:


13

Dies liegt an der mangelnden Präzision von pi und an der insgesamt fehlenden Präzision des eingebauten Systems.

pi = 3.1415926536

pi/2 = 1.5707963268 

cos(1.5707963268) = -5.103412e-12

FYI =  5.103412e-12 = 0.000000000005103412 ~ 0 


Über die Gesamtsystemgenauigkeit:

3.141592653589793238462643383 = 3.1415926536 

In Python erhalten wir Folgendes:

>>> float("3.141592653589793238462643383")
3.141592653589793

Wie wir sehen können, gibt es ein Problem mit der Genauigkeit, da sie nicht einmal mit der Float-Darstellung übereinstimmt.


Dies ist auf mangelnde Genauigkeit zurückzuführen, aber ein Fehler dieser Größenordnung kann nicht auf Gleitkommazahlen übertragen werden.
Dennis Jaheruddin

2
Es ist wahrscheinlich eher ein Mangel an Präzision mit dem pi-Wert.
Matthieu Riegler

5

Sie speichern π nicht mit ungewöhnlicher Gleitkommapräzision. Sie verwenden einen falschen Wert für π mit doppelter Genauigkeit. Um ungefähr 3.1415926536 in Binärform zu approximieren , sind mindestens 38 Bit erforderlich:

3.14159265359922… > 11.001001000011111101101010100010001001

Beachten Sie, dass 2 ^ -36 ungefähr 1,5e-11 ist, was mit dem nachfolgenden 99 übereinstimmt. Gleitkomma mit doppelter Genauigkeit hat eine 52-Bit-Bedeutung. Um cos(pi/2)als -5e-12 zu bewerten , wäre die einzig mögliche Wahl ein 48-Bit-Typ, was sehr seltsam wäre.

In der Nähe von 0 und π, wo die Ableitung nahezu Null ist, kann cos (θ) nicht sehr genau berechnet werden:

cos(3.1415926536) ≈ -0.999999999999999999999947911

Das unterscheidet sich von -1 um ungefähr 5.2e-23, was kleiner als ε für ist double, und wird daher cos(3.1415926536)als genau -1 berechnet ... was falsch ist.

In der Nähe von ± π / 2 beträgt die Ableitung [ -sin (θ) ] nahezu ± 1, sodass der Fehler am Eingang zum Ausgang wird.

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

Ich habe zufällig einen TI-Rechner, der eine Ziffer weniger anzeigt und cos(π/2)als -5.2e-12 berechnet . Es ist jedoch elektronisch sehr unterschiedlich und wurde entwickelt, um einen genauen Wert für anzugeben cos(90°).

Ich würde vermuten, dass in Spotlight cos(pi/2)berechnet wird, indem ein Wert für π abgerufen, in eine Dezimalzeichenfolge konvertiert , dieser als (exakter, rationaler) Binärwert gespeichert wird der wahre Wert von π / 2. Sie sollten herausfinden, ob cos(pi/2 + cos(pi/2))es näher an Null liegt (es könnte -2,2e-35 sein).

Die Multiplikation mit einer Zweierpotenz sollte nur den Exponenten beeinflussen, nicht den Signifikanten. Es kann möglich sein, durch wiederholtes Halbieren oder Verdoppeln zu bestimmen, wie gerundet wird.


Mit dem Markdown ist nichts falsch - MathJax ist nur auf mathematikbezogenen Websites aktiviert, nicht auf SE-weit.
grg

1
cos (pi / 2 + cos (pi / 2)) wird genau als 0 angezeigt.
Nick Matteo

4

Es ist ein Fehler, der unter 10.9.2 reproduzierbar ist - und ein solcher Gleitkomma-Rundungsfehler ist ziemlich typisch.

Es ist der Wert von pi, der ohne ausreichende Präzision behandelt wird, wenn ich raten musste.

  • cos (999999 * pi) hat keinen Fehler
  • cos ((999999 + 1) * pi) weist eine fehlerhafte Rundung auf

Ich würde zu https://developer.apple.com/bug-reporting/ gehen, wenn Sie Apples Fehlerbehebungsgerät in Aktion sehen möchten.


5
Ist es wirklich ein Fehler? Wie genau sollte eine solche Operation sein?
Édouard

Ich bin kein registrierter Entwickler, aber ich wäre Ihnen sehr dankbar, wenn Sie es für uns einreichen könnten!
Poitroae

4
@ Édouard Sie könnten es als Fehler betrachten, wenn der Benutzer einige Fähigkeiten für symbolische Mathematik erwartet. Jedes Computeralgebra-System (CAS) weiß natürlich genau, dass cos (π / 2) = 0 ist! Andererseits ist es kaum vernünftig zu erwarten, dass Spotlight ein CAS enthält. Und im Bereich der Gleitkomma-Arithmetik sind Ergebnisse wie die OP-Berichte zu erwarten. Jeder Fehlerbericht kann möglicherweise besser als Funktionsanforderung bezeichnet werden.
Harald Hanche-Olsen

1
@ Édouard bmike ist in der Tat richtig, dass dies ein Fehler ist und nicht nur ein Rundungsfehler. Die erwartete Genauigkeit einer solchen Operation beträgt bei einer Standardarithmetik mit doppelter Genauigkeit etwa 10 ^ -16, nicht 10 ^ -12. Sie können dies selbst versuchen, indem Sie ein Programm in Ihrer Lieblingssprache schreiben, das die Gleitkommaunterstützung der CPU nutzt, die Berechnung durchführt und das Bitmuster des Ergebnisses untersucht. Wie bmike sagt, ist der wahrscheinliche Grund, dass der von Spotlight verwendete π-Wert nicht mit ausreichender Genauigkeit definiert wird.
Szabolcs

2
Hier ist etwas Seltsames los. cos(2*acos(0)*0.5)gibt eine Reihe von Bestellungen zurück 10^-10. Es liegt also nicht daran, dass die π-Konstante nicht genau genug ist. Ich kann dieses Ergebnis nicht erklären: Es ist zu ungenau für doppelte Genauigkeit und zu präzise für einfache Genauigkeit.
Szabolcs

4

Aus den anderen Antworten und Kommentaren wird Folgendes deutlich:

Die Tatsache, dass Sie ein Ergebnis ungleich Null erhalten, ist KEIN Fehler, selbst bei einer perfekten Implementierung der Software würden Sie an die Grenzen von Gleitkommaberechnungen stoßen. Der Fehler in der Größenordnung von 10 ^ -12 ist jedoch sehr groß.

Dies ist NICHT auf die Ungenauigkeit von Gleitkommazahlen zurückzuführen. Das Ergebnis ist genau das:

cos(1.5707963268)

Dies kann mit jedem alternativen Softwarepaket überprüft werden. Wenn Sie cos(pi/2)in einem dieser Pakete bewerten, erhalten Sie definitiv ein Ergebnis, das viel näher an Null als 10 ^ -12 liegt.

Abschließend sehe ich zwei mögliche Einschränkungen, von denen eine gelten muss:

  1. Pi wird nicht mit ausreichender Genauigkeit gespeichert, oder zumindest pi / 2 führt zu einer unzureichenden Genauigkeit
  2. Cos nimmt einfach unzureichende Präzision als Eingabe

Vielleicht kann jemand mit Zugriff auf die Software überprüfen, welche davon zutrifft.

Update Wie im Kommentar erwähnt, scheint das Problem die Genauigkeit der Konstante zu sein pi.


Das ist komisch. 1.5707963268 ist das Ergebnis, das Spotlight Ihnen bei der Berechnung von pi / 2 liefert. Nach ein paar einfachen Versuchen scheint Spotlight 10 signifikante Stellen für Zahlen unter 1 und 11 für Zahlen über 1 anzuzeigen. Aber aus welchem ​​seltsamen Implementierungsgrund würde ein Rundungsschritt innerhalb der Berechnung anstelle von nachher angewendet werden ?
Édouard

1
Ich wollte auch darauf hinweisen, dass die Genauigkeit zunimmt, wenn Sie Spotlight eine genauere Näherung pi / 2 zur Verfügung stellen (z. B. durch Kopieren von mehr als 10 Stellen aus Wolfram Alpha).
Édouard

Vielen Dank, dass Sie meine Vermutung bestätigt haben, dass die Genauigkeit von pi die Ursache für den Fehler zwischen 0 und ungefähr 10 ^ -12 in der Frage des OP war.
bmike

Wie oft sehen Sie dies: "10 ^ -12 ist wirklich groß"
GEdgar

2

Dass unter Berücksichtigung -5e-12wird eine verryyyy kleine Zahl, dies ist ein Rundungsfehler.

Ich denke, es ist die Folge davon, dass das Scheinwerferlicht mehr Dezimalstellen anzeigt, als bei der Definition der piKonstanten oder der unendlichen Reihen verwendet werden, die zur Berechnung der Triggerfunktionen verwendet werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.