Code review request for 7002594 "Math.max and Math.min should use floatToRawIntBits() to check for -0.0"

Ulf Zibis Ulf.Zibis at gmx.de
Thu Dec 2 17:38:01 UTC 2010


Am 01.12.2010 23:33, schrieb Joe Darcy:
> Rémi Forax wrote:
>>
>> I just wonder why twoToTheDoubleScaleUp and twoToTheDoubleScaleDown in FpUtils
>> aren't real constants (static final).
>
> Just an oversight; they are logically constants -- the next time I edit this class, I'll fix that.

IMHO those constants are superfluous, as they are only used once.
Additionally, scale_factor only needs to range-adjusted in [-MAX_SCALE, MAX_SCALE]
So we can code much more simple:

     public static double scalb(double d, int scale_factor) {
         // ...
         final int MAX_SCALE = DoubleConsts.MAX_EXPONENT + -DoubleConsts.MIN_EXPONENT +
                               DoubleConsts.SIGNIFICAND_WIDTH + 1;

         // Make sure scaling factor is in a reasonable range

         scale_factor = Math.min(Math.max(scale_factor, -MAX_SCALE), MAX_SCALE);
         int scale_delta= 512;
         double exp_delta = powerOfTwoD(scale_delta);
         if(scale_factor < 0)
             exp_delta = powerOfTwoD(scale_delta= -scale_delta);

         // Calculate (scale_factor % +/-512), 512 = 2^9, using
         // technique from "Hacker's Delight" section 10-2.
         final int t = (scale_factor >> 9-1) >>> 32 - 9;
         final int exp_adjust = ((scale_factor + t) & (512 -1)) - t;

         for(d*=powerOfTwoD(exp_adjust), scale_factor-=exp_adjust;
                 scale_factor!=0; scale_factor-=scale_delta)
             d *= exp_delta;
         return d;
     }

And even more simpler, if we trust the optimizer:

     public static double scalb(double d, int scale_factor) {
         // ...
         final int MAX_SCALE = DoubleConsts.MAX_EXPONENT + -DoubleConsts.MIN_EXPONENT +
                               DoubleConsts.SIGNIFICAND_WIDTH + 1;

         // Make sure scaling factor is in a reasonable range

         scale_factor = Math.min(Math.max(scale_factor, -MAX_SCALE), MAX_SCALE);
         final int scale_delta = scale_factor < 0 ? -512 : 512;
         final double exp_delta = powerOfTwoD(scale_delta);

         // Calculate (scale_factor % +/-512), 512 = 2^9, using
         // technique from "Hacker's Delight" section 10-2.
         final int t = (scale_factor >> 9-1) >>> 32 - 9;
         final int exp_adjust = ((scale_factor + t) & (512 -1)) - t;

         for(d*=powerOfTwoD(exp_adjust), scale_factor-=exp_adjust;
                 scale_factor!=0; scale_factor-=scale_delta)
             d *= exp_delta;
         return d;
     }


- Ulf




More information about the core-libs-dev mailing list