我使用attoparsec的内置解析器'double'和'number'来解析浮点值,我从不同的解析器得到不同的结果。
>解析号码“8.918605790440055e-2”
完成“”8.918605790440054e-2
>解析双“8.918605790440055e-2”
完成“”8.918605790440055e-2
使用'number'解析器似乎失去了一些精度,而'double'解析器却没有。因为'double'解析器设法做到这一点,因此可以将8.918605790440055e-2表示为double,为什么'number'解析器会返回不同的结果?这是一个错误吗?
我使用的是attoparsec 0.10.4.0。
答案 0 :(得分:14)
注意:此功能几乎比理性快十倍。在积分输入上,它提供了完全准确的答案,和浮点输入,它比
rational
稍微不准确。
attoparsec
默认情况下交换速度的准确性,如果您需要完全准确的解析,则必须使用较慢的rational
解析器。
结果的差异是如此之小,以至于在大多数情况下,它并不重要,因此速度较快的默认解析器总体上可能是一个更大的胜利。
答案 1 :(得分:12)
好吧,让我们看一下the documentation。
注意:此功能几乎比
rational
快十倍,但准确度稍差。
Double
类型支持大约16位小数的精度。对于94.2%的数字,此函数和rational
给出相同的结果,但对于剩余的5.8%,此函数在第15个小数位附近失去精度。对于0.001%的数字,此函数将在第13或第14位小数处丢失精度。
注意:此功能几乎比
rational
快十倍。在积分输入上,它给出了完全准确的答案,而对于浮点输入,它的准确性略低于理性。
他们都被承认稍微不准确(以换取相对较快)。 number
的不准确性未被量化,因此其不准确性与double
不同的事实不是错误。
如果准确性至关重要,请使用rational
。