Gleitkommazahlen in Java genau genug?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Wenn ich das ergebnis mit sich selbst multipliziere muss das Argument unter der Quadratwurzel rausommen. Ist es das, dann war das Ergebnis genau genug. Die Genauigkeit ist +/- 0. Beispiel: Wurzel(4) = 2 ... Probe 2 * 2 = 4. ok.

Ist es das nicht, dann probieren +/-1 die letzte gültige Ziffer des float ob das Ergebnis dann in einem Fall kleiner im anderen größer als das Wurzelargument ist. Ist es das, dann ist die Genauigkeit eben der Wert +/-1 der letzten float stelle.

ist es das immer noch nicht, dann +/-2 der letzten gültigen float Ziffer, usw. Die letzte gültige float ziffer muss man in den Unterlagen zum floatnachschauen wieviel diese bei gegebenen wert ist -- kann man auch irgendwie bestimmen. Hat was mit der binärdarstellung des float zu tun mit mantisse, basis, exponent, usw.


iqKleinerDrache  08.01.2019, 12:45

ums noch besser zu machen nicht +/-1 gleichzeitig. sondern erst +1 dann mit dem ursprungsergebnis als multiplikation vergleichen. ist die abweichung in unterschiedlichen richtungen, wars das schon ... so in etwa. ich denke du verstehst was ich meine.

1
iqKleinerDrache  08.01.2019, 12:51

Anmerkung. eigentlich ist auch im ersten fall die genauigkeit nicht +-0, sondern +- der genauigkeit des float type (z.B. 17 gültige ziffern +-5 der 18ten stelle). Würde ich aber nicht machen, da die COmputerrundung bei Wurzel in die eine bei Multiplikation in die andere Richtung geht und somit inder Regel wirklich wenn Abweichung 0 rauskommt es auch 0 war ... selbst mit 1000 stellen genauigkeit ;-)

1

Ich denke mal, bei der Antwort kommt es auf die genaue Aufgabenstellung an. Für die allermeisten Anwendungen reicht die Genauigkeit eines double-Wertes locker aus. Wenn man es genauer braucht, muss man halt auf BigDecimal ausweichen.

Quadratwurzeln von Nicht-Quadratzahlen sind aber immer irrational, also muss man sich selbst ein Limit setzen, bis zu welcher Genauigkeit man die Zahlen berechnen will.

double quadratwurzel = Math.sqrt(double-Wert);


AldoradoXYZ  08.01.2019, 12:32

Mh ja, ist nur keine Antwort auf die Frage.

0

Gleitkommazahlen haben keine beliebig hohe "Auflösung", es kann also nicht jede Zahl dargestellt werden, sondern nur annäherungsweise.

Ob das Ergebnis "genau genug" ist hängt von der Aufgabe ab.

Bei genauerer Überlegung würde ich über https://de.wikipedia.org/wiki/IEEE_754 argumentieren. Damit kann man sich die "Auflösung" berechnen und somit den maximal möglichen Fehler ermitteln. Ist der maximal mögliche Fehler innerhalb der Toleranz, dann ist double, float ok.

Gruß