...
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å med 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.
Eksempel 1 Code Block |
---|
language | java |
---|
title | NaN-code |
---|
| double d1 = Math.sqrt(-1); // NaN
double inf = Double.POSITIVE_INFINITY;
double d2 = inf - inf; // NaN |
| Eksempel 2 Code Block |
---|
language | java |
---|
title | Infinity |
---|
| double pos_inf = Double.POSITIVE_INFINITY; // Infinity
double neg_inf = Double.NEGATIVE_INFINITY; // -Infinity
System.out.println(pos_inf - 10); // Infinity
System.out.println(neg_inf - 10); // -Infinity
System.out.println(pos_inf * -1); // -Infinity |
|
---|
...