检查float modulo int是否是有限序数

时间:2011-06-01 17:43:57

标签: python floating-point modulo

在for循环中,我在时间上与常数,分数时间步长进行积分,dt.我只想保存整数(有限序数)时间点的模拟结果。我的解决方案如下,

dt = 0.1
steps = 100

for step in range(steps):
    if (step*dt) % 1 == 0.0:
        print step

我从来没有真正信任浮点数上的模运算。有没有更好的方法来检查浮子是否是完整的还是我只是偏执狂?

2 个答案:

答案 0 :(得分:2)

这在任何编程语言中都很危险。 在您的示例中,0.1无法在浮点中完全表示,因此测试将永远不会通过(我想它可能会在2 ^ 24次迭代后执行)。在许多情况下,步长可能不具有浮点的精确表示,因此累积的舍入误差导致测试错误地触发/不触发。在其他情况下,随着累积值变大,最终由于指数增加而开始失去精度(在您的示例中,假设Python默认使用单精度,在20971529次迭代后您将获得错误的触发)。 / p>

尝试找到一种方法来避免对浮点值执行相等性测试(检查整数值就是这样一个测试)。因此,在您的情况下,只需在step % 10上进行测试。

答案 1 :(得分:1)

我也不信任花车,你可以使用the Decimal type,或者你可以使用types。我更喜欢类型。