在浮点数学中,如果x和y是可精确表示的整数,那么(x/y)*y==x总是真的吗



在浮点数学中,如果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

你说你发现这似乎是真的;也许你的打印精度不够。

相关内容

最新更新