# 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.
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;

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;

scale_factor!=0; scale_factor-=scale_delta)
d *= exp_delta;
return d;
}

- Ulf

```