Jest utrata precyzji w
float a;
float b;
double result = 1 + a*b;
- reprezentacji
float
.
- produkt z
a
i b
, który również będzie oznaczony jako float
. Uwaga: a * b
jest dodatkiem na 1 może spowodować utratę precyzji.
Aby powinny że a * b
może stracić większą precyzją
for (int i = 1; i < 100; i += 2) {
float a = i;
float b = 1.0f/i;
if ((double) a * b != a * b && a * b != 1)
System.out.println(i + " " + (double) a * b + " " + a * b);
}
wydruki
41 0.999999962747097 0.99999994
47 0.9999999683350325 0.99999994
55 0.9999999683350325 0.99999994
61 0.9999999441206455 0.99999994
83 0.999999962747097 0.99999994
97 0.999999969266355 0.99999994
uwaga: może to również zdarzyć odzyskać precyzję utracone i uzyskać właściwą odpowiedź po b
traci precyzję
for (int i = 1; i < 20; i += 2) {
float a = i;
float b = 1.0f/i;
if (b != 1.0/i && a * b == 1)
System.out.println(i + " " + (double) a * b + " " + a * b);
}
drukuje
3 1.0000000298023224 1.0
5 1.0000000149011612 1.0
7 1.0000000447034836 1.0
9 1.0000000074505806 1.0
11 1.0000000298023224 1.0
13 1.000000037252903 1.0
15 1.0000000521540642 1.0
17 1.0000000037252903 1.0
19 1.0000000074505806 1.0
Istnieje z definicji; 'float' to 32-bitowy, podstawowy 2 IEEE 754 zmiennoprzecinkowy, podczas gdy' double' jest 64-bitowy. Jedynym zdarzeniem, w którym nie jest to prawdą, jest to, że wszystkie trzy wejścia i wyniki mogą się zmieścić w 'float'. – fge
Zasadniczo chciałem się dowiedzieć, czy Java konwertuje a * b do debla za kulisami. Z odpowiedzi widzę, że tak nie jest. – Quirion