2012-05-24 55 views
20

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的怪癖?

+5

請注意,Python 3的行爲方式與GHCi相同。 –

+0

有趣,謝謝。你碰巧知道IEEE爲什麼規定舍入到偶數?這對我來說似乎並不直觀 - 無論是從零開始還是從零開始都會更有意義。 –

+1

我想如果你捨去一堆數字然後總結它們,那麼它更有可能取消舍入誤差... –

回答

23

它在說明書中。你可以看到它在部分6.4.6的the Haskell report

round x最接近的整數返回到x,偶數整數如果x是 兩個整數之間的距離相等。

正如@dflemstr所指出的,這是根據IEEE Standard for Floating-Point Arithmetic

+4

這是根據IEEE 754浮點舍入模式標準。 – dflemstr

+0

如果有人感興趣,下面是'round'的代碼:http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC-Real.html#round檢查是否相當那裏很明顯。 – Poindexter

+2

FWIW,作爲比較,python round()是C99 round()函數的一個包裝,它在C99附件F循環之後的實現中與零相關。 – janneb