假设我们在 Java 中有两个 double:
double a, b; // a and b are any decimals that have exact representation in IEEE-754
是否保证
a * b
和a / b
返回准确的结果,并且在不超过+/- INF
的情况下具有精确的双精度表示?
不。 想象两个满足要求的数字
a
和b
。这意味着 a op b
是准确的。 现在继续如下过程。
double a = 1.5; // exact
double b = 1.5; // exact
for (int i = 0; i < 16; i++) {
System.out.println(a);
a *= b; // a is presumed to be exact each time based on assumption
}
打印
1.5
2.25
3.375
5.0625
7.59375
11.390625
17.0859375
25.62890625
38.443359375
57.6650390625
86.49755859375
129.746337890625
194.6195068359375
291.92926025390625
437.8938903808594
656.8408355712891
最终,由于有效数空间有限,
q op b
将失去精度。 结果不以 5
结尾即可证明。