Rechenungenauigkeit bei java rauskriegen?

Aufrufe: 77     Aktiv: 09.06.2022 um 18:42

0

enter image description here

Wie kriege ich hind das sqrt(2)*sqrt(2) genau 2 ergibt? oder kann man irgendwie beim vergleich noch toleranzen mit einbauen ?

Diese Frage melden
gefragt

Punkte: 12

 
Kommentar schreiben
1 Antwort
1

Der Vergleich über == ist bei Fließkommazahlen nicht zu empfehlen, denn die gespeicherten Zahlen sind nicht exakt so wie sie theoretisch sein müssten. Das liegt ganz einfach an der Art, wie floats und doubles gespeichert werden. Da gibt es immer einer Abweichung, wodurch der direkte Vergleich nicht funktioniert. Wenn du mehr darüber wissen willst ist sicher https://en.wikipedia.org/wiki/IEEE_754 ein guter Einstieg. Umgehen kannst du das Problem auf vielen Wegen. Der einfachste wäre über die Toleranzen, wie du richtig festgestellt hast. Du vergleichst dann nicht die Zahlen direkt miteinander, sondern schaust ob die Differenz der Zahlen innerhalb einer Toleranz ist.

Du machst also statt

a == b

jetzt

(a - b) < TOLERANZ

Sagen wir mal du hast a=5 und b=5, durch die Ungenauigkeit ist aber tatsächlich b=4.999999999 und a=5.0000000000001 gespeichert. Wenn du deine Toleranzgrenze jetzt auf z.B. 0.0001 festlegst bekommst du über (a-b) < TOLERANZ trotzdem true, obwohl die Zahlen nicht exakt gleich sind.

Bei dir wäre das also

(c2 - (a2+b2)) < TOLERANZ

Wichtig: Beachte die Vorzeichen. Wenn a < b ist wird dein Ergebnis negativ, deine Bedingung wird dann immer true. Um auf Nummer sicher zu gehen solltest du von der Differenz den Betrag nehmen, um das Vorzeichen zu eliminieren. Hierfür gibt es die abs() Funktion aus Math.abs().

Math.abs(c2 - (a2+b2)) < TOLERANZ

die Toleranz kannst du frei wählen, basierend auf deiner gewünschten Genauigkeit.

Diese Antwort melden
geantwortet

Punkte: 125

 

Kommentar schreiben