我使用attoparsec的内置解析器“double”和“number”来解析浮点值,并从不同的解析器中得到不同的结果。
解析号"8.918605790440055e-2“ 已订“8.918605790440054e-2 解析双"8.918605790440055e-2“ 已订“8.918605790440055e-2
使用'number‘解析器似乎失去了一些精度,而'double’解析器却没有。因为有可能将8.918605790440055e-2表示为一个双,因为“double”解析器成功地做到了这一点,为什么'number‘解析器返回不同的结果?这是个虫子吗?
我正在使用attoparsec 0.10.4.0。
发布于 2013-03-08 17:09:38
好吧,让我们看看the documentation。
double
注意:这个函数的速度几乎是rational的十倍,但精度稍低。
Double类型支持大约小数点16位的准确性。对于94.2%的数字,该函数和rational给出了相同的结果,但对于其余的5.8%,该函数在小数点15位附近丢失了精度。对于0.001%的数字来说,这个函数将在小数点13或14位时失去精度。number
注意:这个函数的速度几乎是rational的十倍。对于积分输入,它给出了完全精确的答案,而对于浮点输入,它的精度略低于理性。它们都被认为是稍微不准确的(作为交换条件是相对快速)。number的不准确是没有量化的,因此它的不准确性与double的不一样这一事实并不是一个缺陷。
如果准确性是最重要的,请使用rational。
发布于 2013-03-08 17:06:52
It is intentional
注意:这个函数比rational快十倍。对于积分输入,它给出了非常精确的答案,和浮点输入,它比
rational稍差一些。
默认情况下,attoparsec用精确性来换取速度,如果您需要非常精确的解析,则必须使用速度较慢的rational解析器。
结果的差异如此之小,以至于在大多数情况下,这并不重要,所以更快的默认解析器总体上可能是一个更大的胜利。
https://stackoverflow.com/questions/15298961
复制相似问题