我使用attoparsec内置的解析器'double'和'number'来解析浮点值,并且我从不同的解析器中得到不同的结果。
>解析数";8.918605790440055e-2";
完成"8.918605790440054e-2
>解析双精度";8.918605790440055e-2";
完成"8.918605790440055e-2
使用"number"语法分析器似乎会失去一些精度,而"double"语法分析器则不会。既然可以将8.918605790440055e-2表示为double,既然"double"解析器能够做到这一点,为什么"number"解析器会返回不同的结果?这是个虫子吗?
我使用的是attoparsec 0.10.4.0。
这是有意的:
注意:这个函数几乎比rational快十倍。在积分输入上,它给出了完全准确的答案,;在浮点输入上,其准确度略低于
rational
。
默认情况下,attoparsec
以准确性换取速度,如果您需要完全准确的解析,则必须使用较慢的rational
解析器。
结果的差异非常小,对于大多数目的来说,这并不重要,所以总体而言,更快的默认解析器可能是一个更大的胜利。
好吧,让我们看看文档。
-
double
注意:此函数几乎比
rational
快十倍,但精度稍差。Double
类型支持大约16位小数的精度。对于94.2%的数字,此函数和rational
给出了相同的结果,但对于剩余的5.8%,此函数在小数点后第15位左右失去了精度。对于0.001%的数字,此函数将在小数点后第13位或第14位失去精度。 -
number
注意:此功能几乎比
rational
快十倍。对于积分输入,它给出了完全准确的答案,而对于浮点输入,它的准确性略低于有理。
它们都被认为有点不准确(以换取相对快速(。number
的不准确度没有量化,因此其不准确度与double
的不准确率不同这一事实并不是一个错误。
如果准确性至关重要,请使用rational
。