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为什么规定舍入到偶数?这对我来说似乎并不直观 - 无论是从零开始还是从零开始都会更有意义。 –
我想如果你舍去一堆数字然后总结它们,那么它更有可能取消舍入误差... –