Frage

Alle Mathematikfunktionen in JavaScript verwenden Radians anstelle von Grad. Dennoch sind sie entweder ungleich oder ich bin weit weg von der Basis.

Die Umwandlung von Grad zu einem Radian lautet:

var rad = angle * Math.PI / 180

Ein 90 -Grad -Winkel gleich 1.57079633 Radian

Der Cosinus eines 90 -Grad -Winkels gleich 0.
Der Cosinus eines 1,57079633 Radian gleich -3.20510345 × 10-9.

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

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

Ich fehlt hier offensichtlich etwas Offensichtliches, aber Junge, ist er den Code vermasselt.

War es hilfreich?

Lösung

Alles wird in einem Schritt gemacht, um Rundungsfehler zu vermeiden

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

Das Stimmt Der Wert von PI kann nicht genau als schwimmende Punktzahl dargestellt werden, sodass der wahre Wert von PI / 2 auch nicht kann. Sie können also nicht geben Math.cos Der genaue Wert, der erforderlich ist, um 0 zu bekommen-9 ist ein sehr, sehr klein Nummer. Wenn Sie eine 10.000 Kilometer lange Länge zeichnen würden, wären Sie 1 cm von der entsprechenden Achse entfernt.

Genau das sollten Sie beim Umgang mit schwimmenden Punktzahlen erwarten. Vergleichen Sie nicht mit Gleichheit - vergleichen Sie innerhalb einer Toleranz.

Andere Tipps

Es wird immer Rundfehler geben. Und schwimmender Punkt ist sowieso nicht mathematisch genau, es ist nur genau auf eine bestimmte Menge erheblicher Ziffern.

Ändern Sie Ihren Code so, dass er nicht "vermasselt" wird, wenn Sie in der Reihenfolge von 1/1000000000 Fehler haben.

Für die meisten von uns machen ernsthafte Summen auf Computern 0 IST gleich -3,20510345 × 10^-9 zu einem angemessenen Grad der Genauigkeit, das Sie bei der Arbeit mit Gleitkomma-Zahlen erwarten können. Dies ist ein Thema, das regelmäßig auf SO behandelt wird.

Ja, Sie verlieren hier nur Daten zu Typkonvertierungen.

90 Dehre in Radians entspricht nicht genau 1,57079633. Wenn es mehr Dezimalstellen gäbe, würde dies wie erwartet direkt zurückkehren.

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

Auch genommen von Msdn:

Darüber hinaus kann sich das Ergebnis von Arithmetik- und Zuordnungsoperationen mit Doppelwerten aufgrund des Genauigkeitsverlusts des Doppelarts leicht unterscheiden. Beispielsweise kann das Ergebnis der Zuordnung eines buchstäblichen Doppelwerts in den 32-Bit- und 64-Bit-Versionen des .NET-Frameworks unterschiedlich sein. Das folgende Beispiel zeigt diese Differenz, wenn der wörtliche Wert -4.42330604244772E -305 und eine Variable, deren Wert -4,42330604244772E -305 einer doppelten Variablen beträgt. Beachten Sie, dass das Ergebnis der Parse -Methode (String) in diesem Fall nicht unter einem Präzisionsverlust leidet.

In Computern π/2 Radians kann nicht Genau gleich 90 Grad, da π eine unendlich lange Zahl ist. Daher kann man mit π nicht ein perfektes Präsidium erwarten, es sei denn, der Computer ist ∞-Bit.

Ich habe gerade festgestellt:

-3.20510345 × 10-9 ist das gleiche wie -0.00000000320510345, was sehr nahe Null liegt.

Die Konvertierung von Google in Radian ist abgerundet, und das Runding verursacht das ERR.

Ich vermute, dass JavaScript, das wegen seiner mangelnden Präzision mit Zahlen berüchtigt ist, auch einen falschen Radian erzeugt, und daher ist sein Kochen weit weg.

Ich bin mir nicht sicher, wie ich das lösen würde - Runden ist nicht akzeptabel, da dies für andere Winkel nicht funktionieren würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top