bezpośrednim przypadkach myślałem, by sprawdzić 0, + nieskończoność i nieskończoność i NaN:
static void check(double x) {
double a, b;
System.out.printf(
"%9s %9s %23s %5s%n",
x, a = x - Math.ulp(x), b = Math.nextAfter(x, Double.NEGATIVE_INFINITY), a == b);
System.out.printf(
"%9s %9s %23s %5s%n",
x, a = x + Math.ulp(x), b = Math.nextAfter(x, Double.POSITIVE_INFINITY), a == b);
System.out.println();
}
public static void main(String[] args) throws java.lang.Exception {
check(0);
check(Double.POSITIVE_INFINITY);
check(Double.NEGATIVE_INFINITY);
check(Double.NaN);
}
Ideone demo
wyjściowa:
0.0 -4.9E-324 -4.9E-324 true
0.0 4.9E-324 4.9E-324 true
Infinity NaN 1.7976931348623157E308 false
Infinity Infinity Infinity true
-Infinity -Infinity -Infinity true
-Infinity NaN -1.7976931348623157E308 false
NaN NaN NaN false
NaN NaN NaN false
że wyrażenia aren” t równe w przypadku NaN
nie jest zaskakujące (z definicji NaN); ale te wyrażenia również nie są prawdziwe dla + nieskończoności i -infinity (patrz ostatnia kolumna).
Ta odpowiedź nie ma na celu dostarczenia wyczerpującej listy problematycznych wartości, ale raczej pokazania, że istnieją pewne problematyczne wartości.
Patrząc na to, co dzieje się na liczbach całkowitych dwóch, takich jak 0,25, 0,5, 1,0, 2,0 itd., Powinniśmy uzyskać ważny wgląd w zmiennoprzecinkowe. –