2010-09-19 4 views
5

Alle mathematischen Funktionen in JavaScript verwenden Radiant anstelle von Graden. Aber sie sind entweder ungleich, oder ich bin weit weg von der Basis.cos von Graden, die nicht dem cos des äquivalenten Radianten entsprechen

Die Umwandlung von Grad in einem Radiant ist:

var rad = angle * Math.PI/180 

einem 90 Grad Winkel equals 1,57079633 radian

den Kosinus einer 90-Grad-Winkel equals 0.
den Kosinus einer 1,57079633 radian equals -3.20510345 × 10-9.

Beachten Sie, dass in der Javascript, alles in einem Schritt durchgeführt wird, um Rundungsfehler zu vermeiden:

var cos = Math.cos(angle * Math.PI/180); 

ich natürlich etwas offensichtlich hier fehlt bin, aber Junge ist es, den Code zu vermasseln. Rundungsfehler

Antwort

11

alles in einem Schritt getan zu vermeiden

Wie funktioniert das Rundungsfehler vermeiden? Es bedeutet nur, dass die Rundungsfehler nicht in einer separaten Variablen verfügbar sind, das ist alles.

Der true Wert von Pi kann nicht genau als Gleitkommazahl dargestellt werden, so dass der wahre Wert von Pi/2 auch nicht. So können Sie Math.cos nicht den genauen Wert geben, um 0 zu erhalten. Aber hey - 10 -9 ist ein sehr, sehr kleine Nummer. Wenn Sie also eine 10.000 Kilometer lange Linie ziehen würden, würden Sie am Ende 1cm von der entsprechenden Achse abweichen.

Dies ist genau das, was Sie erwarten sollten, wenn Sie mit Gleitkommazahlen arbeiten. Vergleiche nicht mit Gleichheit - vergleiche innerhalb einer Toleranz.

+0

218k !? Hab nicht aufgepasst, als ich dich das letzte Mal gesehen habe, warst du auf 10k! –

+2

Das ist meine erste Frage, die Jon Skeet als eine Antwort wert hielt. – SamGoody

+0

Die von Jon erwähnte Toleranz wird in Formularen oft als Epsilon bezeichnet –

1

Es wird immer zu Rundungsfehlern kommen. Und Floating Point ist sowieso nicht mathematisch genau, es ist nur auf eine bestimmte Anzahl von signifikanten Stellen genau.

Ändern Sie den Code so, dass er bei Fehlern in der Größenordnung von 1/1000000000 nicht "versaut" wird.

1

Für die meisten von uns tun ernsthafte Summen auf Computern 0 IS gleich -3.20510345 × 10^-9 zu einem angemessenen Grad der Genauigkeit, die Sie haben ein Recht zu erwarten, wenn mit Gleitkommazahlen arbeiten. Dies ist ein Thema, das regelmäßig zu SO behandelt wird.

-3

Ich habe gerade realisiert:

-3,20510345 × 10-9 das gleiche wie -,00000000320510345 ist, die sehr nahe bei Null ist.

Googles Umwandlung in Radiant ist gerundet, und diese Rundung verursacht den Fehler.

Meine Vermutung ist, dass Javascript, das für seine mangelnde Präzision mit Zahlen berüchtigt ist, auch ein falsches Radiant erzeugt, und deshalb ist seine Cosign weg.

Nicht sicher, wie ich das lösen würde - Rundung ist nicht akzeptabel, da das für andere Winkel nicht funktionieren würde.

+2

Ich glaube nicht, dass JS "berüchtigter für seinen Mangel an Genauigkeit mit Zahlen ist" als alles andere, das Gleitkommaarithmetik verwendet. Außerdem wäre es besser, wenn Sie dies als Bearbeitung zu Ihrer Frage hinzufügen, anstatt sie als Antwort zu veröffentlichen. –

+0

Als ich anfing, es als Antwort zu schreiben, gab es keine anderen Antworten. Und es beantwortet die Frage - wenn ich es als Bearbeitung hinzugefügt hätte, würden sich die Leute beschweren, dass es keine gültige Frage gibt. – SamGoody

1

Ja, Sie verlieren nur Daten über Typumwandlungen hier.

90 Grad im Bogenmaß ist nicht genau gleich 1,57079633. Wenn es mehr Dezimalstellen gäbe, würde das genau wie erwartet zurückkonvertiert.

Sie müssen immer mit solchen Dingen vorsichtig sein. Wie oben erwähnt, ist die 10^-9 nah genug an Null.

Auch aus MSDN genommen:

Zusätzlich wird das Ergebnis der arithmetischen und Zuweisungsoperationen mit Doppel Werte können wegen des Verlustes der Genauigkeit der Doppeltyp leicht nach Plattform unterscheiden. Beispielsweise kann das Ergebnis der Zuweisung eines Literal-Double-Werts in den 32-Bit- und 64-Bit-Versionen von .NET Framework abweichen. Das folgende Beispiel veranschaulicht diesen Unterschied, wenn der Literalwert -4.42330604244772E-305 und eine Variable, deren Wert -4.42330604244772E-305 ist, einer Double-Variablen zugewiesen sind. Beachten Sie, dass das Ergebnis der Parse (String) -Methode in diesem Fall nicht zu einem Genauigkeitsverlust führt.

0

In Computern, π/2 Radiant kann nicht genau gleich 90 Grad, da π eine unendlich lange Zahl ist. Daher kann man mit π kein perfektes Presicion erwarten, es sei denn, der Computer ist ein ∞-Bit.

Verwandte Themen