...
Hva flyttall angår vil det vil sjeldent være grunn til å bruke noe annet enn double. Det som er viktig å bemerke seg er at et flyttall blir mindre og mindre nøyaktig desto større det blir og at man kan oppleve upresise beregninger selv på små verdier.
Code Block |
---|
language | java |
---|
title | Loss of precision |
---|
| double d1 = 0.1;
System.out.println(d1); // 0.1
double d2 = 0.2;
System.out.println(d2); // 0.2
System.out.println(d1 + d2); // 0.30000000000000004
// ??? |
Husk at vi prøver å representere flyttall med et begrenset antall bit, noe som gir mulighet for feil. Presisjon er nøkkelordet, og som vist ovenfor er ikke denne alltid helt perfekt.
| Code Block |
---|
language | java |
---|
title | Comparing double |
---|
| double d1 = 0.1;
double d2 = 0.2;
double d3 = d1 + d2;
System.out.println( d3 == 0.3); // False |
Med dette i bakhodet må vi alltid være varsomme når vi sammenligner doubleverdier. Ikke bruk ==, men heller en veldig liten epsilonverdi til å filtrere bort små aritmetiske "feil". Code Block |
---|
language | java |
---|
title | Epsilonvalue |
---|
| double eps = 0.00001;
System.out.println( (d3 - eps < 0.3) && (0.3 < d3 + eps)); // True
|
|
---|
Double tar også tre "merkelige" verdier som er greit å vite om:
NaN: "Not a number", NaN kan tildeles en double dersom vi prøver å utføre operasjoner som ikke lar seg gjøre. Se under, eksempel 1.
Infinity: "Uendelig", Infinity er større enn alle tall, og følger noen enkle regler, eksempel 2.
-Infinity: "Negativ uendelig", -Infinity er mindre en alle tall, og følger de samme reglene som Infinity.
...