4

我正在使用 attoparsec 的内置解析器“double”和“number”来解析浮点值,并且从不同的解析器中得到不同的结果。

>解析号码“8.918605790440055e-2”

完成“” 8.918605790440054e-2

> 解析双“8.918605790440055e-2”

完成“” 8.918605790440055e-2

使用“数字”解析器似乎会丢失一些精度,而“双”解析器则不会。由于可以将 8.918605790440055e-2 表示为双精度,因为“双”解析器设法做到了,为什么“数字”解析器返回不同的结果?这是一个错误吗?

我正在使用 attoparsec 0.10.4.0。

4

2 回答 2

14

这是故意的

注意:这个函数几乎比理性快十倍。在整数输入上,它给出了完全准确的答案,而在浮点输入上,它的准确度略低于rational.

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

结果的差异是如此之小,以至于对于大多数目的来说,这并不重要,所以更快的默认解析器总体上可能是一个更大的胜利。

于 2013-03-08T17:06:52.453 回答
12

好吧,让我们看一下文档

  • double

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

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

  • number

    注意:这个函数比rational. 在整数输入上,它给出了完全准确的答案,而在浮点输入上,它的准确度略低于理性。

它们都被认为有点不准确(以换取相对较快)。number的不准确度没有被量化,因此它的不准确度与 's 不同的事实double不是错误。

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

于 2013-03-08T17:09:38.727 回答