copySign function
Returns the first argument with the sign of the second argument.
A NaN sign argument is treated as positive.
magnitudethe value to return.signthe sign for the returned value. Returns the magnitude with the same sign as thesignargument.
Implementation
double copySign(double magnitude, double sign) {
// The highest order bit is going to be zero if the
// highest order bit of m and s is the same and one otherwise.
// So (m^s) will be positive if both m and s have the same sign
// and negative otherwise.
/*final long m = Double.doubleToRawLongBits(magnitude); // don't care about NaN
final long s = Double.doubleToRawLongBits(sign);
if ((m^s) >= 0) {
return magnitude;
}
return -magnitude; // flip sign*/
if (sign == 0.0 || sign.isNaN || magnitude.sign == sign.sign) {
return magnitude;
}
return -magnitude; // flip sign
}