2011-06-01 46 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。我更喜歡類型。