Eryk Sun <[email protected]> added the comment:
A binary float has the form (-1)**sign * (1 + frac) * 2**exp, where sign is 0
or 1, frac is a rational value in the range [0, 1), and exp is a signed integer
(but stored in non-negative, biased form). The smallest value of frac is
epsilon, and the smallest increment for a given power of two is thus epsilon *
2**exp. To get exp for a given value, we have log2(abs(value)) == log2((1 +
frac) * 2**exp) == log2(1 + frac) + log2(2**exp) == log2(1 + frac) + exp. Thus
exp == log2(abs(value)) - log2(1 + frac). We know log2(1 + frac) is in the
range [0, 1), so exp is the floor of the log2 result. For a binary64, epsilon
is 2**-52, but we can leave it up to the floating point implementation by using
sys.float_info:
>>> exp = math.floor(math.log2(time.time()))
>>> sys.float_info.epsilon * 2**exp
2.384185791015625e-07
Anyway, it's better to leave it to the experts:
>>> t = time.time()
>>> math.nextafter(t, math.inf) - t
2.384185791015625e-07
----------
nosy: +eryksun
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue39484>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com