Vergelijken van doubles
Geplaatst: di 18 jan 2011, 15:08
De meesten onder jullie weten hopelijk dat het vergelijken van twee variabelen van het type double (of float) risico's met zich meebrengt als deze variabelen afkomstig zijn van berekeningen. Met invoer en initialisatie lukt het nog net om waarden te vergelijken.
In volgende voorbeeld wordt dit op eenvoudige wijze getoond en al een oplossing gegeven met de statisch methode gelijk.
Met uitvoer:
Nu komt het wel eens vaker voor dat getest moet worden of doubles eenzelfde waarde hebben. Echter, de grootte orde van deze waarden verschil van programma tot programma en zelfs in de programma's. De keuze van de waarde epsilon ligt dan ook niet voor de hand.
De vraag is dus als volgt:
- Wat zijn de richt waarden van epsilon zo al?
- zijn er beter methoden om gelijkheid van doubles te controleren.
- doubles hebben een eindige precisie. Is er een interval waarin de berekeningen met een optimale nauwkeurigheid kunnen gebeuren?
In volgende voorbeeld wordt dit op eenvoudige wijze getoond en al een oplossing gegeven met de statisch methode gelijk.
Code: Selecteer alles
public class Nauwkeurigheid {
public static double epsilon=10e-40;
public static void main(String[] args) {
double a=0.3;
double b=0.2;
double c=0.1;
System.out.println(c+b+a);
System.out.println(c+b+a == 0.6);
System.out.println(gelijk(c+b+a,0.6));
System.out.println();
System.out.println(a+b+c);
System.out.println(a+b+c ==0.6);
System.out.println(gelijk(a+b+c,0.6));
}
public static boolean gelijk(double a, double b){
return Math.abs(a-b)<epsilon;
}
}
Code: Selecteer alles
0.6000000000000001
false
false
0.6
true
true
De vraag is dus als volgt:
- Wat zijn de richt waarden van epsilon zo al?
- zijn er beter methoden om gelijkheid van doubles te controleren.
- doubles hebben een eindige precisie. Is er een interval waarin de berekeningen met een optimale nauwkeurigheid kunnen gebeuren?