【发布时间】:2013-08-04 13:40:35
【问题描述】:
有人对haskell(GHCi,版本7.2.1)中这种奇怪的四舍五入有解释吗?除非我乘以 100,否则一切似乎都很好。
*Main> 1.1
1.1
*Main> 1.1 *10
11.0
*Main> 1.1 *100
110.00000000000001
*Main> 1.1 *1000
1100.0
*Main> 1.1 *10000
11000.0
编辑:令我困惑的是,舍入误差仅在乘以 100 时显示。
Edit(2):我收到的 cmets 让我意识到,这与 haskell 完全无关,而是浮点数的普遍问题。已经提出(并回答了)许多关于浮点数奇数问题的问题,其中根本问题通常是将浮点数与实数混淆。
Perl、python、javascript 和 C 都报告 1.1 * 100.0 = 110.00000000000001。这是 C 的作用
double 10.0 * 1.1 = 11.000000000000000000000000
double 100.0 * 1.1 = 110.000000000000014210854715
double 110.0 = 110.000000000000000000000000
double 1000.0 * 1.1 = 1100.000000000000000000000000
“为什么只有在乘以 100 时才会发生这种情况”的问题(即使有 110.0 的精确表示)仍然没有答案,但我想除了完全单步执行浮点乘法之外,没有简单的答案(感谢 Dax Fohl 强调 10 在二进制中没什么特别的)
【问题讨论】:
-
我认为马丁在问为什么它发生在 100 而不是 1000 或 10000。起初我也觉得这很奇怪。但是(大概)原因是,乘以 10 的幂不只是移位数字;它经过一些二进制乘法器,你最终得到它给你的尾数和指数。由于 10 在二进制中没有什么特别之处,因此您最终可能会得到乍看之下很奇怪的东西,例如。
-
@rampion 感谢您发布一个没有直接解决问题的 100 页文档的无用链接。
标签: rounding floating-accuracy