HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Modulebytestring-0.12.2.0Haskell2010

Data.ByteString.Builder.RealFloat

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.

Example4 expressions
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

Example4 expressions
showHex (castDoubleToWord64 1.0e23) []"44b52d02c7e14af6"castWord64ToDouble 0x44b52d02c7e14af59.999999999999997e22castWord64ToDouble 0x44b52d02c7e14af69.999999999999999e22castWord64ToDouble 0x44b52d02c7e14af71.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 Data.ByteString.Builder.RealFloat.Internal.acceptBounds. This will give us

Example2 expressions
floatDec 1.0e23"1.0e23"doubleDec 1.0e23"1.0e23"

For more details, please refer to the Ryu paper.

  • 1 type
  • 8 values

Custom formatting

7 declarations

Returns a rendered Float. Returns the 'shortest' representation in scientific notation and takes an optional precision argument in standard notation. Also see floatDec.

With standard notation, the precision argument is used to truncate (or extend with 0s) the 'shortest' rendered Float. The 'default precision' does no such modifications and will return as many decimal places as the representation demands.

e.g

Example5 expressions
formatFloat (standard 1) 1.2345e-2"0.0"formatFloat (standard 10) 1.2345e-2"0.0123450000"formatFloat standardDefaultPrecision 1.2345e-2"0.01234"formatFloat scientific 12.345"1.2345e1"formatFloat generic 12.345"12.345"

Returns a rendered Double. Returns the 'shortest' representation in scientific notation and takes an optional precision argument in standard notation. Also see doubleDec.

With standard notation, the precision argument is used to truncate (or extend with 0s) the 'shortest' rendered Float. The 'default precision' does no such modifications and will return as many decimal places as the representation demands.

e.g

Example5 expressions
formatDouble (standard 1) 1.2345e-2"0.0"formatDouble (standard 10) 1.2345e-2"0.0123450000"formatDouble standardDefaultPrecision 1.2345e-2"0.01234"formatDouble scientific 12.345"1.2345e1"formatDouble generic 12.345"12.345"