attoparsec错误解析双打

时间:2013-03-08 16:39:54

标签: parsing haskell floating-point 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。

2 个答案:

答案 0 :(得分:14)

It is intentional

  

注意:此功能几乎比理性快十倍。在积分输入上,它提供了完全准确的答案,和浮点输入,它比rational稍微不准确

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

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

答案 1 :(得分:12)

好吧,让我们看一下the documentation

  • double

      

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

         

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

  • number

      

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

他们都被承认稍微不准确(以换取相对较快)。 number的不准确性未被量化,因此其不准确性与double不同的事实不是错误。

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