[pypy-dev] Optimize constant float division by multiplication?

Toni Mattis toni.mattis at student.hpi.uni-potsdam.de
Thu Nov 6 23:19:56 CET 2014


Hi Armin,

that sounds more convenient than manipulating floats as architecture
dependent integers ;) So this is my implementation now:

https://bitbucket.org/amintos/pypy/commits/f30efb9a8e54e56af7e7a0d07ec19d6985c1f4e0?at=float-opt


BTW, the jit log (PYPYLOG=jit-log-opt,jit-backend) tends to round small
floats like '1.0 / 8.98846567431158e+307' to '0.000000', but '1.0 /
2.2250738585072014e-308' appears as a full 308-digit decimal number.
This may cause some confusion when checking where the optimization is
effective.


Best regards,

Toni


Am 06.11.2014 um 19:08 schrieb Armin Rigo:
> Hi Toni,
> 
> On 6 November 2014 18:29, Toni Mattis
> <toni.mattis at student.hpi.uni-potsdam.de> wrote:
>> thanks for the advice. I tried what Armin proposed and like to share my
>> results with you:
>>
>> https://bitbucket.org/amintos/pypy/commits/937254cbc554adfb748e3b5eeb44bf765d204b9d?at=default
> 
> Thanks!  Maybe instead of manipulating directly the bits (where you
> have to be extra careful because on 32-bit platforms, regular RPython
> integers have only 32 bits), you could use math.frexp().  The
> condition should be "math.frexp(x)[0] == 0.5" or "-0.5".  You can then
> check for denormals by checking that "math.frexp(1.0 / x)[0]" is also
> 0.5 or -0.5.
> 
> I think that "x / inf" is always equal to "x * 0.0" (which can be
> "0.0", "-0.0", or "nan", so it can't be simplified further), but it
> looks like a useless optimization imho.
> 
> 
> A bientôt,
> 
> Armin.
> 


More information about the pypy-dev mailing list