attoparsec对替身的错误解析



我使用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

最新更新