Wie Sie vielleicht wissen, kann Spotlight einfache Mathematik ausführen. Wenn Sie beispielsweise tippen, cos(pi)
führt dies -1
erwartungsgemäß 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?
pi
selbst wäre fest codiert (wenn Sie -1 für erhaltencos(pi)
), aber sobald Sie es manipulieren, erhalten Sie eine Gleitkommazahl, die eine begrenzte Genauigkeit hat. OSX nicht schwer Codepi/2
,pi/4
etc, es macht tatsächlich die Operation.0.1
genau 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.irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
Antworten:
Dies liegt an der mangelnden Präzision von pi und an der insgesamt fehlenden Präzision des eingebauten Systems.
Über die Gesamtsystemgenauigkeit:
In Python erhalten wir Folgendes:
Wie wir sehen können, gibt es ein Problem mit der Genauigkeit, da sie nicht einmal mit der Float-Darstellung übereinstimmt.
quelle
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:
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 dahercos(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.
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 anzugebencos(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, obcos(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.
quelle
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.
Ich würde zu https://developer.apple.com/bug-reporting/ gehen, wenn Sie Apples Fehlerbehebungsgerät in Aktion sehen möchten.
quelle
cos(2*acos(0)*0.5)
gibt eine Reihe von Bestellungen zurück10^-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.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:
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:
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
.quelle
Dass unter Berücksichtigung
-5e-12
wird 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
pi
Konstanten oder der unendlichen Reihen verwendet werden, die zur Berechnung der Triggerfunktionen verwendet werden.quelle