Is there a tool to know whether a value has an exact binary representation as a floating point variable?

binary, c, floating-point, linux

Solution

Here's a Python snippet that does exactly what you ask for; it needs Python 2.7 or Python 3.x. (Earlier versions of Python are less careful with floating-point conversions.)

import decimal, sys
input = sys.argv[1]
if decimal.Decimal(input) == float(input):
    print("Exactly representable")
else:
    print("Not exactly representable")

Usage: after saving the script under the name 'exactly_representable.py',

mdickinson$ python exactly_representable.py 1.25
Exactly representable
mdickinson$ python exactly_representable.py 0.1
Not exactly representable
mdickinson$ python exactly_representable.py 1e22
Exactly representable
mdickinson$ python exactly_representable.py 1e23
Not exactly representable

Problem

My C API has a function that takes as input a `double`. Only 3 or 4 values are valid input, all other values are non valid input and rejected. I'd like to check if all my valid input values can be represented exactly so that I could avoid the epsilon check to ease readability. Is there a tool (preferably on command line) that could tell me whether a decimal value has an exact binary representation as a floating point value?

Original source