Warum ergeben sin (45) und cos (45) unterschiedliche Ergebnisse? [Duplikat

Diese Frage hat hier bereits eine Antwort:

Ist Gleitkomma-Mathematik kaputt? 28 answers

Das ist etwas, was ich nicht erwartet hatte. Ich weiß, dass diese Zahlen nicht 100% genau sind, aber ich habe keine komplementären Winkel erwartet, die unterschiedliche Ergebnisse von @ liefersin undcos:

Diese folgende Funktion gibt @ zurü0.70710678118654746000000...

sin(45 * PI / 180.0);

während diese folgende Funktion zurückgibt0.70710678118654757000000...

cos(45 * PI / 180.0);

so ist es

0.707106781186547**46**000000... vs
0.707106781186547**57**000000...

und nicht nur die ...sin(1 * PI / 180.0) gibt auch eine etwas andere Zahl zurück alscos(89 * PI / 180.0) obwohl sie gleich sein sollten.

Moreover Es ist nicht nur einsin vscos Problem, es ist auch einsin vssin Problem:sin(1 * PI / 180.0) gibt einen anderen Wert als @ zurüsin(179 * PI / 180.0), wieder sollten sie gleich sein.

Ich habe versucht, Bogenmaß und nicht Grad zu verwenden, und es gibt genau den gleichen Unterschied. Ich habe versucht, einen kleinen PI-Wert und einen großen PI-Wert (ca. 100 Dezimalstellen und mehr) zu verwenden. Sie sind immer noch unterschiedlich. Ich habe versucht, @ zu verwendecmath Anstatt vonmath.h, Ich habe versucht, @ zu verwendM_PI anstelle einerPI von mir selbst definiert.

Der Unterschied ist immer gleich, um die 16. Dezimalstelle. Versteht mich nicht falsch, ich weiß, dass ich niemals einen 100% genauen Wert dieser Zahlen erhalten werde, aber MINDESTENS hatte ich erwartet, den gleichen "ungenauen" Wert von @ zu erhaltesin undcos von komplementären Winkeln. Was zum Teufel ist mit all dem los?

Ich brauche, dass sie gleich sind, weil das Programm, an dem ich arbeite (ein Schwerkraftsimulator, zu dem ich aufgefordert wurde), Objekte verwendet, diedouble (Ich habe auch versuchtfloat) Variablen, die im Grunde genommen Winkel sind (Grad oder Bogenmaß, ich habe beide ausprobiert). Das sind die Richtungen, in die sich die Objekte bewegen. Außerdem benötige ich die Winkel, um die Wechselwirkungen zwischen den Objekten zu berechnen.

Die Winkel ändern sich in jeder Iteration des Programms, und in jeder Iteration ändern sich die Winkel basierend auf den Berechnungen der Winkel der vorherigen Iteration. Wenn also an einem Punkt ein minimal falscher Winkelwert vorliegt, wird dieser Fehler immer stärker jede Iteration.

Das Programm führt Tausende und sogar Millionen von Iterationen aus, sodass der Fehler des Werts absurd groß wird! Um es klar auszudrücken, Planeten geraten irgendwann aus dem Gleichgewicht und alles wird zur Katastrophe. Ich bin wirklich verrückt:

Ps. Ich bin auf Windows 7, 32 Bits.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage