Question

I am using attoparsec's built-in parsers 'double' and 'number' to parse floating point values and I get different results from different parsers.

>parse number "8.918605790440055e-2"

Done "" 8.918605790440054e-2

> parse double "8.918605790440055e-2"

Done "" 8.918605790440055e-2

Using the 'number' parser seems to lose some precision whilst the 'double' parser does not. As it's possible to represent 8.918605790440055e-2 as a double since the 'double' parser manages to do it why does the 'number' parser return a different result? Is this a bug?

I am using attoparsec 0.10.4.0.

Was it helpful?

Solution 2

Well, let's look at the documentation.

  • double

    Note: This function is almost ten times faster than rational, but is slightly less accurate.

    The Double type supports about 16 decimal places of accuracy. For 94.2% of numbers, this function and rational give identical results, but for the remaining 5.8%, this function loses precision around the 15th decimal place. For 0.001% of numbers, this function will lose precision at the 13th or 14th decimal place.

  • number

    Note: This function is almost ten times faster than rational. On integral inputs, it gives perfectly accurate answers, and on floating point inputs, it is slightly less accurate than rational.

They are both acknowledged to be slightly inaccurate (in exchange for being relatively fast). number's inaccuracy is not quantified, so the fact that its inaccuracy is not the same as double's is not a bug.

If accuracy is paramount, use rational.

OTHER TIPS

It is intentional:

Note: This function is almost ten times faster than rational. On integral inputs, it gives perfectly accurate answers, and on floating point inputs, it is slightly less accurate than rational.

attoparsec traded accuracy for speed by default, if you need perfectly accurate parsing, you have to use the slower rationalparser.

The difference in the results is so small that for most purposes, it doesn't matter, so the faster default parser is on the whole probably a bigger win.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top