Haskell中有關於round
函數的官方規範嗎?在GHCI 7.0.3版我看到以下行爲:回合到最接近的整數
ghci> round (0.5 :: Double)
0
ghci> round (1.5 :: Double)
2
由於兩個0.5和1.5表示的是完全一樣的浮點數,我期望看到相同的行爲在Python:
>>> round(0.5)
1.0
>>> round(1.5)
2.0
有差異的理由,還是GHCi的怪癖?
Haskell中有關於round
函數的官方規範嗎?在GHCI 7.0.3版我看到以下行爲:回合到最接近的整數
ghci> round (0.5 :: Double)
0
ghci> round (1.5 :: Double)
2
由於兩個0.5和1.5表示的是完全一樣的浮點數,我期望看到相同的行爲在Python:
>>> round(0.5)
1.0
>>> round(1.5)
2.0
有差異的理由,還是GHCi的怪癖?
它在說明書中。你可以看到它在部分6.4.6的the Haskell report:
round x
最接近的整數返回到x
,偶數整數如果x
是 兩個整數之間的距離相等。
正如@dflemstr所指出的,這是根據IEEE Standard for Floating-Point Arithmetic。
這是根據IEEE 754浮點舍入模式標準。 – dflemstr
如果有人感興趣,下面是'round'的代碼:http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC-Real.html#round檢查是否相當那裏很明顯。 – Poindexter
FWIW,作爲比較,python round()是C99 round()函數的一個包裝,它在C99附件F循環之後的實現中與零相關。 – janneb
請注意,Python 3的行爲方式與GHCi相同。 –
有趣,謝謝。你碰巧知道IEEE爲什麼規定舍入到偶數?這對我來說似乎並不直觀 - 無論是從零開始還是從零開始都會更有意義。 –
我想如果你捨去一堆數字然後總結它們,那麼它更有可能取消舍入誤差... –