# Math.abs, praktische Anwendung?



## pixel (19. Jan 2007)

Hallo zusammen,

im Buch gibt es folgendes Beispiel:


```
double d = 0.0; 
while ( d != 1.0 ) 
{ 
  d += 0.1; 
  System.out.println( d ); 
}
```
Damit soll gezeigt werden das es Probleme mit der Rundung gibt wenn man bei Fließkommazahlen einen absoluten Vergleich benötigt. Das ist soweit klar. Als eine möglichen Lösung gibt es:



> Eine zweite Möglichkeit neben dem echten Kleiner/Größer-Vergleich ist, eine erlaubte Abweichung zu definieren. Mathematiker bezeichnen die Abweichung von zwei Werten mit dem griechischen Kleinbuchstaben Epsilon. Wenn wir einen Vergleich von zwei Fließkommazahlen anstreben und bei einem Gleichheitsvergleich die Abweichung mit betrachten wollen, so schreiben wir einfach:




```
if ( Math.abs(a - b) <= epsilon ) 
  ...
```



> Epsilon ist die erlaubte Abweichung. Math.abs(x) berechnet von einer Zahl x den Absolutwert.



Was ist denn ein Absolutwert? Ich erkenne den Sinn der Funktion nicht so ganz. Wie kann ich die Funktion in das erste Code-Beispiel einbauen damit die Schleife nicht über die 1.0 hinaus läuft?

Viele Grüße
pixel


----------



## Gast (19. Jan 2007)

Absolutwert von 1.340000000007 = 1.340000000007
Absolutwert von -1.340000000007 = 1.340000000007

also einfach positiv machen

---------


```
double d = 0.0; 
while ( Math.abs(d - 1.0) > 0.00001 ) 
{ 
  d += 0.1; 
  System.out.println( d ); 
}
```

das ist aber immer noch ein blödes und gefährliches Vorgehen,
zum Glück nur ein Beispiel


----------



## SnooP (19. Jan 2007)

blöd und gefährlich - aber dennoch das einzige was man machen kann, oder nicht? Man muss halt wissen, wie niedrig die Abweichung maximal sein darf oder kann...

Zu Absolutwert sagt man im Deutschen auch gerne Betrag einer Zahl.


----------



## pixel (19. Jan 2007)

ok, hab's verstanden. Vielen dank.


----------



## Slater (19. Jan 2007)

ich meinte, es gibt genug gute Gründe diese Math.abs einzusetzen,
aber nicht in dieser Schleife und dort vergleicht man eh nicht mit != sondern <, > und dann verwendet man auch nicht double mit 0.1-Schritten,

also in jeder Hinsicht zu vermeiden,
daher verbietet sich eigentlich

> Wie kann ich die Funktion in das erste Code-Beispiel einbauen


----------

