Gleitkommazahlen in Java genau genug?
Ich sitze schon seit einigen Minuten vor folgender Fragestellung:
"Die Quadratwurzel kann i.d.R. bei der Berechnung in Java mit einem Gleitkommatyp nicht 100%ig bestimmt werden.
Formuliere und begründe ein sinnvolles Kriterium, wann das Ergebnis genau genug ist."
Ist damit nun gemeint wann die Berechnung enden soll oder das es lediglich im MIN und MAX_VALUE Bereich von float bzw. double liegen muss? Irgendwie verstehe ich es nicht so ganz.
4 Antworten
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.
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 ;-)
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.
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);
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ß