在浮点数学中,如果 x 和 y 是可精确表示的整数,(x / y) * y == x 是否总是正确的?
In floating point math, is it always true that (x / y) * y == x, if x and y are exactly representable integers?
在浮点数学中,如果 x 和 y 是可精确表示的整数,(x / y) * y == x 是否总是正确的?
我已经尝试了 x 和 y 的各种值,看起来是真的,但我不确定。
如果这是真的,我想了解为什么。如果这不是真的,我想了解它不是真的是什么价值观。
我没想到它是真的,因为我知道浮点数中的 x / y 不能保证完全等于使用实数的 x / y,所以我认为不准确会被放大乘法,导致计算结果与x不同。
这不是真的:
for (var x = 1.0; x <= 30.0; x++)
for (var y = 1.0; y <= 30.0; y++)
if ((x / y) * y != x)
System.out.printf("%s / %s * %2$s = %s%n", x, y, (x / y) * y);
输出:
7.0 / 25.0 * 25.0 = 7.000000000000001
13.0 / 23.0 * 23.0 = 12.999999999999998
14.0 / 25.0 * 25.0 = 14.000000000000002
15.0 / 11.0 * 11.0 = 14.999999999999998
15.0 / 13.0 * 13.0 = 14.999999999999998
15.0 / 22.0 * 22.0 = 14.999999999999998
15.0 / 26.0 * 26.0 = 14.999999999999998
15.0 / 29.0 * 29.0 = 15.000000000000002
21.0 / 19.0 * 19.0 = 21.000000000000004
23.0 / 21.0 * 21.0 = 23.000000000000004
25.0 / 11.0 * 11.0 = 25.000000000000004
25.0 / 22.0 * 22.0 = 25.000000000000004
26.0 / 23.0 * 23.0 = 25.999999999999996
27.0 / 13.0 * 13.0 = 27.000000000000004
27.0 / 21.0 * 21.0 = 27.000000000000004
27.0 / 23.0 * 23.0 = 27.000000000000004
27.0 / 26.0 * 26.0 = 27.000000000000004
28.0 / 25.0 * 25.0 = 28.000000000000004
29.0 / 7.0 * 7.0 = 29.000000000000004
29.0 / 14.0 * 14.0 = 29.000000000000004
29.0 / 25.0 * 25.0 = 28.999999999999996
29.0 / 27.0 * 27.0 = 29.000000000000004
29.0 / 28.0 * 28.0 = 29.000000000000004
30.0 / 11.0 * 11.0 = 29.999999999999996
30.0 / 13.0 * 13.0 = 29.999999999999996
30.0 / 22.0 * 22.0 = 29.999999999999996
30.0 / 26.0 * 26.0 = 29.999999999999996
30.0 / 29.0 * 29.0 = 30.000000000000004
你说你发现好像是真的;也许您打印的精度不够。
在浮点数学中,如果 x 和 y 是可精确表示的整数,(x / y) * y == x 是否总是正确的?
我已经尝试了 x 和 y 的各种值,看起来是真的,但我不确定。 如果这是真的,我想了解为什么。如果这不是真的,我想了解它不是真的是什么价值观。
我没想到它是真的,因为我知道浮点数中的 x / y 不能保证完全等于使用实数的 x / y,所以我认为不准确会被放大乘法,导致计算结果与x不同。
这不是真的:
for (var x = 1.0; x <= 30.0; x++)
for (var y = 1.0; y <= 30.0; y++)
if ((x / y) * y != x)
System.out.printf("%s / %s * %2$s = %s%n", x, y, (x / y) * y);
输出:
7.0 / 25.0 * 25.0 = 7.000000000000001
13.0 / 23.0 * 23.0 = 12.999999999999998
14.0 / 25.0 * 25.0 = 14.000000000000002
15.0 / 11.0 * 11.0 = 14.999999999999998
15.0 / 13.0 * 13.0 = 14.999999999999998
15.0 / 22.0 * 22.0 = 14.999999999999998
15.0 / 26.0 * 26.0 = 14.999999999999998
15.0 / 29.0 * 29.0 = 15.000000000000002
21.0 / 19.0 * 19.0 = 21.000000000000004
23.0 / 21.0 * 21.0 = 23.000000000000004
25.0 / 11.0 * 11.0 = 25.000000000000004
25.0 / 22.0 * 22.0 = 25.000000000000004
26.0 / 23.0 * 23.0 = 25.999999999999996
27.0 / 13.0 * 13.0 = 27.000000000000004
27.0 / 21.0 * 21.0 = 27.000000000000004
27.0 / 23.0 * 23.0 = 27.000000000000004
27.0 / 26.0 * 26.0 = 27.000000000000004
28.0 / 25.0 * 25.0 = 28.000000000000004
29.0 / 7.0 * 7.0 = 29.000000000000004
29.0 / 14.0 * 14.0 = 29.000000000000004
29.0 / 25.0 * 25.0 = 28.999999999999996
29.0 / 27.0 * 27.0 = 29.000000000000004
29.0 / 28.0 * 28.0 = 29.000000000000004
30.0 / 11.0 * 11.0 = 29.999999999999996
30.0 / 13.0 * 13.0 = 29.999999999999996
30.0 / 22.0 * 22.0 = 29.999999999999996
30.0 / 26.0 * 26.0 = 29.999999999999996
30.0 / 29.0 * 29.0 = 30.000000000000004
你说你发现好像是真的;也许您打印的精度不够。