attoparsec错误解析双打

use*_*177 4 floating-point parsing haskell floating-accuracy attoparsec

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

Dan*_*her 14

这是有意的:

注意:此功能几乎比理性快十倍.在积分输入上,它给出了完美准确的答案,而在浮点输入上,它的精确度略低于rational.

attoparsec默认情况下交易速度的准确性,如果您需要完全准确的解析,则必须使用较慢的rational解析器.

结果的差异是如此之小,以至于在大多数情况下,它并不重要,因此速度较快的默认解析器总体上可能是一个更大的胜利.


dav*_*420 12

好吧,让我们来看看文档.

  • double

    注意:此功能几乎快十倍rational,但准确度稍差.

    Double类型支持大约16位小数的精度.对于94.2%的数字,此函数rational给出相同的结果,但对于剩余的5.8%,此函数在小数点后15位处丢失精度.对于0.001%的数字,此函数将在第13或第14位小数处丢失精度.

  • number

    注意:此功能几乎快十倍rational.在积分输入上,它给出了完全准确的答案,而对于浮点输入,它的准确性略低于理性.

它们都被认为是稍微不准确(以换取相对快速).number不准确的不准确,所以它的不准确性与不一样的事实double不是一个错误.

如果准确性至关重要,请使用rational.