hedgehogqa / haskell-hedgehog

Release with confidence, state-of-the-art property testing for Haskell.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Gen.realFrac_ can produce values outside of the bounds of the Range (and might miss values)

jcarr-awake opened this issue · comments

The realFrac_ generator uses the method realToFrac and a double scalar in order to smoothly interpolate between the two endpoints of the range. This causes types to round trip through Double, and may cause them to lose precision. While this is perhaps undesirable on the middle of the range by missing values, it can be particular problematic on the edges. There is no guarantee for RealFrac that this round-trip should preserve the value, and several standard library types such as Fixed do not preserve it.

On the edges, it can cause values to be generated which are below the lower bounds of the range, or above the upper bounds.

To fix this issue, the result value should be clamped to the range, and the function should include warning documentation about possible loss of precision on the inside of the range for high-precision types.

An example value which changes when converted to Double and back (generated randomly by Hedgehog)
357559679.487764797 :: Nano
becomes
357559679.487764775

So if your lower bound was 357559679.487764796 then this could have been incorrectly generated by a realFrac_ generator on Nano