Math.Cos & Math.Sin in C #

8

Ich versuche etwas, von dem ich dachte, dass es relativ einfach sein sollte. Ich habe einen Winkel, eine Position und eine Entfernung, und ich möchte die X, Y-Koordinaten aus dieser Information finden.

Bei einer Beispieleingabe von 90 Grad konvertiere ich den Wert in Radiant mit dem folgenden Code:

%Vor%

Das gibt mir 1,5707963267949 Radianten Dann wenn ich

benutze %Vor%

Ich habe am Ende eine Antwort von: 6.12303176911189E-17

Was zum Teufel ist los? Der Kosinus von 90 Grad sollte 0 sein, also warum bekomme ich eine solche Abweichung ... und was noch wichtiger ist, wie kann ich damit aufhören?

    
elaverick 21.05.2011, 15:14
quelle

5 Antworten

13

Lassen Sie mich Ihre Frage mit einer anderen beantworten: Wie weit denken Sie, dass 6.12303176911189E-17 von 0 ist? Was Sie abweichung nennen, ist eigentlich auf die Art und Weise zurückzuführen, wie Gleitkommazahlen intern gespeichert werden. Ich würde Ihnen empfehlen, den folgenden Artikel zu lesen. In .NET werden sie mit dem IEEE 754-Standard gespeichert.

    
Darin Dimitrov 21.05.2011, 15:15
quelle
5

Siehe Antworten oben. Denken Sie daran, dass 6.12303176911189E-17 ist 0.00000000000000006 (Ich habe vielleicht sogar eine Null dort verpasst!), So ist es eine sehr, sehr kleine Abweichung.

    
Edwin Groenendaal 21.05.2011 15:23
quelle
2

Lesen Sie auf Fließkomma-Arithmetik nach. Es ist nie und kann nie genau sein. Vergleiche niemals genau etwas, aber prüfe, ob sich die Zahlen um ein (kleines) Epsilon unterscheiden.

    
Pontus Gagge 21.05.2011 15:17
quelle
1

Da das Ergebnis der Berechnung wirklich nahe bei 0 (Null) liegt, könnten Sie einfach eine Rundung verwenden:

%Vor%

Also, Berechnung von sin / cos aus dem Radianten :

%Vor%

Was, wenn yourRadianValue = 90 , sin = 1 und cos = 0 zurückgibt.

    
KAI 11.12.2015 11:46
quelle
1

Die anderen Beiträge sind korrekt über die praktische Frage der Arbeit mit Fließkomma-Implementierungen, die Ergebnisse mit kleinen Fehlern zurückgeben. Es wäre jedoch schön, wenn Fließkomma-Bibliotheksimplementierungen die grundlegende Identität bekannter Funktionen beibehalten würden:

Math.Sin(Math.PI) sollte gleich 0 sein,
Math.Cos(Math.PI) sollte gleich -1 sein,
Math.Sin(Math.PI/2) sollte gleich 1 ,
Math.Cos(Math.PI/2) sollte gleich 0 usw. sein.

Sie würden erwarten, dass eine Fließkomma-Bibliothek diese und andere trigonometrischen Identitäten berücksichtigt, ungeachtet der kleinen Fehler in ihrer Konstante Werte (zB Math.PI).

Die Tatsache, dass Sie einen kleinen Fehler von Math.Cos(Math.PI/2) erhalten, zeigt an, dass die Implementierung das Ergebnis berechnet, anstatt es aus einer Tabelle zu ziehen. Eine bessere Implementierung von Math.Cos und den anderen transzendentalen Funktionen könnte für bestimmte Identitäten genauer sein.

Ich bin sicher, dass im Fall von C # dieses Verhalten erwartet wird und Microsoft es nicht ändern konnte, ohne den vorhandenen Code zu beeinträchtigen. Wenn es für Sie wichtig ist, das genaue Ergebnis für bestimmte trigonometrische Identitäten zu erhalten, können Sie die nativen Gleitkommafunktionen mit Code umschließen, der nach bekannten Eingaben sucht.

    
b1tw153 15.12.2017 15:37
quelle

Tags und Links