Math.cos (Math.PI / 2) gibt 6.123031769111886e-17 in JavaScript & AS3 zurück?

8

Wenn ich das richtig verstehe, funktionieren JavaScript und ActionScript 3 mit Radiant.

Die erwartete Ausgabe der folgenden Codes wäre also:

%Vor%

Dies ist das gleiche Verhalten in Firefox, Chrome, Safari und auch in Flash Professional CS5.5. Ich benutze Mac OS X 10.7.2.

Test:

Ссылка

    
Tyilo 08.11.2011, 12:57
quelle

5 Antworten

17

Haben Sie sich den Wert angesehen, den Sie bekommen? Du erwartest 0, aber du bekommst etwas wie

%Vor%

Ist das nicht nahe genug für dich, um es auf Null zu setzen?

Grundsätzlich sollten Sie nicht erwarten, dass binäre Fließkommaoperationen genau sind, wenn Ihre Eingaben nicht als exakte Binärwerte ausgedrückt werden können - was pi / 2 nicht kann, da es irrational ist . (Sie sollten nicht erwarten, dass die Ergebnisse genau sind, selbst wenn die Eingaben genau in binär ausgedrückt werden können, wenn die Ausgabe nicht genau ausgedrückt werden kann ...)

    
Jon Skeet 08.11.2011, 12:59
quelle
2

Math.PI ist keine 100% genaue Darstellung von Pi, nur weil Pi irrational ist und Fließkommazahlen nur so weit gehen.

Sie erhalten also aufgrund von Rundungsfehlern extrem kleine Zahlen (Ihre Zahlen sind #. ##### e-16 und #. ##### e-17, die winzig sind).

Nichts, was Sie dagegen tun können, aber akzeptieren Sie, dass 0.000000000000000006 nahe genug an 0 ist.

    
Niet the Dark Absol 08.11.2011 13:01
quelle
1

Sie haben also 1.xxxxx * 10 ^ -16

Dies wäre 0.0000000000000001xxx (fünfzehn Nullen nach dem Komma)

Ich wette, das ist so nah an Null, dass wir es als 0 betrachten.

Sie erhalten diesen infinitesimalen Fehler wegen des Fehlers im Wert von pi (wie Sie wissen sollten, erstreckt er sich auf unendliche Ziffern nach dem Dezimalpunkt)

Sie haben nicht erwähnt, wenn Sie dies in AS3 oder JavaScript erhalten, obwohl

    
Pranav Hosangadi 08.11.2011 13:09
quelle
1

Weil PI eine irrationale Zahl ist (Real Number ohne Rational zu sein, ist es unmöglich, mit genauem Wert zu rechnen. Wie Jon Skeet sagte, erhalten die trigonometrischen Methoden des Math-Objekts nur ungefähre Werte für PI und geben einen ungefähren Wert zurück. Wenn die Rückgabe von Nullwerten für Ihren Code wichtig ist, müssen Sie sie runden. In solchen Fällen erweitere ich diese Javascript-Objekte nach eigenen Methoden:

%Vor%

Jetzt, während du mit

kommst %Vor%

dieses seltsame Ergebnis

%Vor%

Sie bekommen mit was Sie erwartet haben

%Vor%

Machen Sie dasselbe mit den anderen trigonometrischen Funktionen:

%Vor%

und so weiter.

    
Sedat Kilinc 01.02.2015 03:31
quelle
1

Betrachte diese Fehler sind alle kleiner als 1e-15 , was ungefähr 2**(-50) ist, also können wir addieren und dann eine Zahl mit der Größe 2**3 subtrahieren, um das Ergebnis zu runden. Wenn wir also 8 als Zahl wählen, könnten wir sin und cos wie folgt neu definieren:

%Vor%

Dies sollte den Fehler abrunden und ist schneller als toFixed method.

    
Gary Guo 21.04.2017 19:09
quelle