Any binary floating point can be formatted exactly in decimal. The resulting string might be somewhat long, but it is possible. In my article on floating point I cover the importance of precision, and now I want this function. This challenge is to write a program, or function, that takes a floating point value as input and formats an exact decimal string as output.
To ensure we are working with the correct floating point numbers a precise format must be provided as input to the program. This format will be two integers Significand Exponent
, where the actual floating point value is Significand * 2 ^ Exponent
. Note that either value can be negative.
Specifics:
- The range and precision of at least a 32-bit float must be supported (no input will go beyond that)
- The decimal formatted value must be an exact representation (simply close enough to guarantee a correct round-tip back to float is not good enough)
- We don't trust standard library floating point formatting functions to be correct enough nor fast enough (ex:
printf
), and thus they may not be used. You must do the formatting. Integral formatting/conversion functions are allowed. - There may not be any leading or trailing zeros, except for the required one leading zero in front of the
.
if there is no whole number component - A function, or whole program, is allowed.
Examples:
1 -2 => 0.25
17 -3 => 2.125
-123 11 => -251904
17 50 => 19140298416324608
23 -13 => 0.0028076171875
3 120 => 3987683987354747618711421180841033728
3 -50 => 0.00000000000000266453525910037569701671600341796875
-3 -50 => -0.00000000000000266453525910037569701671600341796875
10 -2 => 2.5
-12345 -3 => -1543.125
0 0 => 0
161 -4 => 10.0625
512 -3 => 64
Shortest code wins.
.0
? \$\endgroup\$0.abc
is not a leading zero, thenabc.0
isn't a trailing one. \$\endgroup\$.0
for whole numbers when dealing with floating point numbers. See for example Python:str(1.0) == '1.0'
versusstr(1) == '1'
. Your logic is still inconsistent. \$\endgroup\$