【发布时间】:2011-08-25 05:14:06
【问题描述】:
我不知道这是否是一个明显的错误,但在运行 Python 脚本来改变模拟参数时,我意识到 delta = 0.29 和 delta = 0.58 的结果丢失了。在调查中,我注意到以下 Python 代码:
for i_delta in range(0, 101, 1):
delta = float(i_delta) / 100
(...)
filename = 'foo' + str(int(delta * 100)) + '.dat'
为 delta = 0.28 和 0.29 生成相同的文件,与 .57 和 .58 相同,原因是 python 返回 float(29)/100 作为 0.28999999999999998。但这不是系统错误,并不是每个整数都会发生这种情况。所以我创建了以下 Python 脚本:
import sys
n = int(sys.argv[1])
for i in range(0, n + 1):
a = int(100 * (float(i) / 100))
if i != a: print i, a
而且我看不到发生此舍入错误的数字中的任何模式。为什么这些特定数字会发生这种情况?
【问题讨论】:
-
这就是 IEEE 754 浮点数的工作原理。我建议你四舍五入将浮点数转回整数,而不是简单地截断。
-
这不是错误 - 它在许多不同的语言中都很常见。有一些解决方法,但在这种情况下,最简单的解决方案可能只是在文件名中使用 idelta。请记住,默认情况下 idelta 不会传递到循环外部。
-
#StdSOAnswer_1。这就是浮点的工作原理。
-
@Tadeck 我会说这仍然是一个错误,它只是现代计算机科学的特有现象。
标签: python