可以将以.0结尾的浮点数视为数学整数吗?

时间:2019-05-31 06:15:23

标签: floating-point precision

我们都知道使用浮点数会导致奇怪的结果:

>>> 0.1*3
0.30000000000000004

我的问题:是否可以将所有以.0结尾的浮点数视为数学整数?

我的用例:

>>> x = 3.4296875
>>> 2*x*(128*x-695)+1856
100.0

是否可以断言没有古怪之处,而得出的结果是真实且精确的100?我的意思是无需手动进行计算!

谢谢!

2 个答案:

答案 0 :(得分:0)

浮点算术不是怪异的魔术。这是一种精确的算术(毕竟,这是一台处理它的机器,而不是陶醉的妖精)。它比自然数或实数算术复杂得多,甚至未知得多。如此短暂或漫长,答案是否定的。 甚至对于类型而言有时看起来也很酷的Python也意识到这一点:

>>> x = 1+1e-100
>>> x == 1
True
>>> isinstance(x,int)
False
>>> isinstance(x,float)
True

威廉·卡汉(William Kahan)的著作具有足够的教学意义,使我们意识到诱骗短途旅行的所有危险。

答案 1 :(得分:0)

是的,等于整数的浮点数的值是数学整数。

“数学整数”是抽象数。它是一个值,而不是特定的格式。根据正式规范,浮点数具有特定的值。如果浮点数的值为整数,则表示的数字为数学整数。

当编写关于浮点算术的证明时,通常将各种值都是整数这一事实作为证明的一部分。

特定浮点值是整数这一事实并不意味着使用该浮点值的所有计算都将产生与精确的实数数学所产生的结果相同的结果。可能导致结果非整数或超出浮点格式精度的计算可能会产生受舍入误差影响的结果。

在显示的代码中,没有舍入错误。 x的值3.4296875恰好是439/128,在所有常见的浮点格式中都可以无错误地表示。因此,将其乘以128会得到一个精确的结果439。将其减去695会得到-256,将2*x*-256乘以得到精确的-1756,然后再加上1856则得到精确的100。它是一个整数。在使用非整数数据的其他情况下,情况可能并非如此。

请注意,要成为整数,在显示时显示数字“ .0”是不够的。某些显示格式产生的精度有限,可能无法显示真正的小数部分。要成为整数,浮点数必须等于整数。实际的分数部分(不仅是显示的部分)必须为零。

另一方面,浮点数是整数这一事实并不意味着如果使用实数运算而不是浮点算术执行相同的运算,本应得到的结果将是整数。当实数结果不是整数时,浮点算术中使用的舍入有可能产生整数结果。