Next floating point number

Bengt Richter bokr at oz.net
Sun Dec 18 03:37:40 EST 2005


On Sun, 18 Dec 2005 10:27:16 +1100, Steven D'Aprano <steve at REMOVETHIScyber.com.au> wrote:

>On Sat, 17 Dec 2005 09:26:39 +0000, Bengt Richter wrote:
>
>
>> I wonder if this won't work (for IEEE 754 double that is)
                                ^^^^^^^^^^^^^^^^^^^[1]
>> 
>> from math import frexp
>> def nextf(x, y):
>>     f,e = frexp(x)
>>     if (f==0.5 or f==-0.5) and x>=y: eps = 2.0**-54
>>     else: eps = 2.0**-53
>>     if x<y: return (f+eps)*2.0**e
>>     else: return (f-eps)*2.0**e
>
>Doesn't that assume floats are 64 bits? Is it possible that they might
>not be on some platform or another?
yes [1], and yes ;-)

I wonder if frexp is always available, and if the above would generalize
to something that could be self-tuning via a decorator or conditional defs.
ISTM I recall a FP format based on shifting 4 bits at a time to normalize,
and keeping an exponent as a multiple of 16, which might need a bunch
of epsilons. Obviously too, you wouldn't want to calculate things like 2.**-53
more than once. Also for a limited range of e integers, 2.**e is probably
faster looked up from a precalculated list p2[e]. The math module could
also expose an efficient multiply by a power of two using FSCALE if
the pentium FPU is there. And there's probably other stuff to take advantage
of, like doing it mostly without the FPU, a la Tim's struct thing. Specialized
C code to do the function could be pretty fast.
I'm a little curious what you are using this for.

Regards,
Bengt Richter



More information about the Python-list mailing list