2012-05-24 53 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