from math import frexp, copysign, isnan, isinf def hex_float(x): # special-case infinities, nans and zeros if isnan(x) or isinf(x): return str(x) sign = '-' if copysign(1.0, x) < 0 else '' if not x: return sign + '0x0p+0' m, e = frexp(x) m = 2.0*abs(m) if m == 1.0: # no (hexa)decimal point required return "%s0x1p%+d" % (sign, e-1) while m != int(m): m *= 16.0 return "%s0x1.%sp%+d" % (sign, ("%x" % int(m))[1:], e-1)