Frage von Phantom6208, 50

Java - warum is hier der cos von 90° nicht 0?

Ich habe folgenden Code:

double radians = Math.toRadians(90);
    
double cos = Math.cos(radians);
double sin = Math.sin(radians);
    
System.out.println("cos:" + cos);
System.out.println("sin:" + sin);

wenn ich das ausführe erhalte ich folgendes ergebins:

cos:6.123233995736766E-17
sin:1.0

müsste nicht der cos von 90° nicht 0 sein?, der sinus währe ja so richtig.

Was mache ich falsch?

Antwort
von NoHumanBeing, 31

10^-17 = 0 im Rahmen der so genannten "Maschinengenauigkeit". Die liegt bei 64-bit Gleitkommaarithmetik etwa bei Epsilon = 10^-16.

Der Cosinus ist eine transzendente Funktion. Der Computer kann zum einen keine analytische Lösung berechnen, sondern muss die Lösung nähern. Jedes "Zwischenergebnis" bei der Ermittlung dieser Näherung wird widerum als Gleitkommazahl dargestellt. Dabei treten Näherungs- und Rundungsfehler auf und die siehst Du hier.

Zum anderen kann der Computer viele Lösungen auch nicht geschlossen darstellen, da die Menge der Gleitkommazahlen eine Teilmenge der rationalen Zahlen ist, die meisten Funktionswerte der Kreisfunktionen allerdings irrationale, sogar transzendente Zahlen sind, das heißt es gibt nicht nur keinen Bruch, der sie beschreibt, sondern sie sind auch keine Nullstelle eines Polynoms, wobei ersteres Kriterium schon mehr als hinreichend dafür ist, dass die Zahl auf dem Computer nicht exakt darstellbar ist. In Deinem Fall wäre die Lösung sogar exakt darstellbar, denn sie ist exakt 0. Der Fehler liegt hier also tatsächlich nur an den verwendeten Algorithmen zur Bestimmung der Näherung.

Kommentar von Phantom6208 ,

Vielen Dank! ich dachte schon ich bin blöd ^^

Das Problem ist erledigt, eigentlich wollte ich nur mehr nachkomma stellen, aber anscheinend macht es der folgende code richtig:

long cos = (long) Math.cos(radians);
long sin = (long) Math.sin(radians);

// ergebins:
// cos:0
// sin:1

Kommentar von NoHumanBeing ,

anscheinend macht es der folgende code richtig

Nicht wirklich.

"long" = vorzeichenbehaftete 64-bit Ganzzahl.

Wenn Du als Winkel z. B. 30° eingibst, wirst Du bei beidem 0 raus bekommen, weil beide unter 1 sind und in einem "long" kein Nachkommaanteil gespeichert werden kann.

Außerdem kann Dir sogar dann "versehentlich" eine Null herauskommen, wenn statt der 1 aufgrund der numerischen Ungenauigkeit mal eine 0.9999999999932487 herauskommt, denn das ist je ebenfalls kleiner, als 1.

Antwort
von W00dp3ckr, 30

10^-17 ist schon sehr sehr nahe an null.

Was Du falsch machst? Es gibt Rundungsfehler bei der Berechnung vom Cosinus und den Radians. Für die kannst Du nichts, außer wenn Du in einem Numerik-Kurs bist :-)

Keine passende Antwort gefunden?

Fragen Sie die Community