2011-06-01 54 views
2

在for循环中,我正在积分关于时间的恒定分数时间步,dt.我只想保存积分(有限序)时间点的模拟结果。我的解决方案如下,检查浮点模数int是否为有限序号

dt = 0.1 
steps = 100 

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

我从来没有真正信任模运算上浮动。有没有更好的方法来检查一个浮点数是不是整数或我只是偏执狂?

回答

2

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

试图找到一种避免对浮点值执行相等性测试的方法(检查整型值就是这样一种测试)。所以在你的情况下,只需测试step % 10

+0

2^24是不是从哪里扯下来的,还是它有什么意义? – 2011-06-01 17:51:43

+0

对IEEE浮点执行任何操作都会给你带来错误,即使它是%10。 – 2011-06-01 17:52:13

+1

@Dhaivat:单精度浮点数有23个尾数位(+1隐含),所以经过大约这样的迭代次数后,OP的'step * dt'将没有小数部分(假设Python默认使用单精度)。正如你可能猜到的,我根本不了解Python;在这里'step'是一个整数类型还是一个浮点类型? – 2011-06-01 17:54:27

1

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