Có một mất độ chính xác trong
float a;
float b;
double result = 1 + a*b;
- các
float
đại diện.
- sản phẩm của
a
và b
cũng sẽ là float
. Lưu ý: a * b
là một số float
- việc thêm vào ngày 1 có thể dẫn đến mất độ chính xác.
Để nên rằng a * b
thể mất chính xác hơn
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);
}
in
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
lưu ý: nó cũng có thể xảy ra hồi chính xác mất và nhận được câu trả lời ngay sau khi b
đã mất độ chính xác
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);
}
in
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
Nguồn
2016-08-22 08:10:23
Có theo định nghĩa; một 'float' là một điểm nổi bật 32 bit, cơ bản 2 IEEE 754 trong khi một' double' là 64bit. Sự kiện duy nhất mà điều này không đúng là _all ba_ của các yếu tố đầu vào và kết quả có thể phù hợp với một 'float'. – fge
Tôi về cơ bản muốn biết nếu Java đã chuyển đổi một * b thành đôi sau hậu trường. Từ câu trả lời, tôi có thể thấy rõ ràng không phải vậy. – Quirion