Patrick - 1 year ago 74
C Question

# IEEE floating-point number to exact base10 character string

Will

`printf('%.9e', value)`
always print the exact base10 representation of
`value`
if
`value`
is an IEEE single precision floating-point number (C/C++ float)?

Will the same hold for
`printf('%.17e', value)`
if
`value`
is an IEEE double precision floating-point number (C/C++ double)?

If not, how can I?

It appears that
`printf('%.17f', value)`
and
`printf('%.17g', value)`
will not.

Will printf('%.9e', value) always print the exact base10 representation?

No. Consider 0.5, 0.25, 0.125, 0.0625 .... Each value is one-half the preceding and needs another decimal place for each decremented power of 2.

`float`, often binary32 can represent values about `pow(2,-127)` and sub-normals even smaller. It would take 127+ decimal places to represent those exactly. Even counting only significant digits, then number is 89+. Example `FLT_MIN` on one machine is exactly

`0.000000000000000000000000000000000000011754943508222875079687365372222456778186655567720875215087517062784172594547271728515625`

`FLT_TRUE_MIN`, the smallest non-zero sub-normal is 151 digits:

`0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125`

By comparison, `FLT_MAX` only takes 39 digits.

`340282346638528859811704183484516925440`

Rarely are exact decimal representation of `float` needed. Printing them to `FLT_DECIMAL_DIG` (typically 9) significant digits is sufficient to uniquely display them. Many systems do not print exact decimal representation beyond a few dozen significant digits.

Vast majority of systems I have used printed `float/double` exactly to at least `DBL_DIG` significant digits (typically 15+). Most systems do so at least to `DBL_DECIMAL_DIG` (typically 17+) significant digits.

Printf width specifier to maintain precision of floating-point value gets into these issues.

`printf('%.*e', FLT_DECIMAL_DIG - 1, value)` will print a `float` to enough decimals places to scan it back and get the same value - (round-trip).

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download