RealFloat is:exact

Efficient, machine-independent access to the components of a floating-point number.
Floating point formatting for Bytestring.Builder This module primarily exposes floatDec and doubleDec which do the equivalent of converting through string7 . show. It also exposes formatFloat and formatDouble with a similar API as formatRealFloat. NB: The float-to-string conversions exposed by this module match show's output (specifically with respect to default rounding and length). In particular, there are boundary cases where the closest and 'shortest' string representations are not used. Mentions of 'shortest' in the docs below are with this caveat. For example, for fidelity, we match show on the output below.
>>> show (1.0e23 :: Float)
"1.0e23"

>>> show (1.0e23 :: Double)
"9.999999999999999e22"

>>> floatDec 1.0e23
"1.0e23"

>>> doubleDec 1.0e23
"9.999999999999999e22"
Simplifying, we can build a shorter, lossless representation by just using "1.0e23" since the floating point values that are 1 ULP away are
>>> showHex (castDoubleToWord64 1.0e23) []
"44b52d02c7e14af6"

>>> castWord64ToDouble 0x44b52d02c7e14af5
9.999999999999997e22

>>> castWord64ToDouble 0x44b52d02c7e14af6
9.999999999999999e22

>>> castWord64ToDouble 0x44b52d02c7e14af7
1.0000000000000001e23
In particular, we could use the exact boundary if it is the shortest representation and the original floating number is even. To experiment with the shorter rounding, refer to acceptBounds. This will give us
>>> floatDec 1.0e23
"1.0e23"

>>> doubleDec 1.0e23
"1.0e23"
For more details, please refer to the Ryu paper.
Write a floating point value to a Builder.
Hugs (September 2006) has buggy definitions for isNaN and isInfinite on Float and Double. If this module is run through CPP with the macro HUGS set to a value no larger than 200609, then correct definitions are used. Otherwise the Prelude definitions are used (which should be correct for other compilers). For example, run Hugs with
hugs -F'cpp -P -DHUGS=200609' Hugs/RealFloat.hs
N.B. The corrected definitions have only been tested to work for Float and Double. These definitions should probably not be used for other RealFloat types. This installation was compiled with the normal Prelude version. This should be correct.
Faster String representations for floating point types. The code is largely taken from code in GHC.Float and the Show instance of Integer in GHC.Num to get the sequence of digits.