Hello.
I happen to already have developped some pure Java version of ceil(double) and
floor(double).
It looks faster to me. But maybe is it incorrect ? (it's tested, but I'm never
sure)
Here it is :
public class FloorCeil {
private static final double TWO_POW_26 =
Double.longBitsToDouble(0x4190000000000000L);
private static final double TWO_POW_N26 =
Double.longBitsToDouble(0x3E50000000000000L);
private static final double TWO_POW_52 =
Double.longBitsToDouble(0x4330000000000000L);
public static double floor(double value) {
// Faster than to work directly on bits.
if (Math.abs(value) <= (double)Integer.MAX_VALUE) {
if (value > 0.0) {
return (double)(int)value;
} else if (value < 0.0) {
double anteComaDigits = (double)(int)value;
if (value != anteComaDigits) {
return anteComaDigits - 1.0;
} else {
return anteComaDigits;
}
} else { // value is +-0.0 (not NaN due to test against
Integer.MAX_VALUE)
return value;
}
} else if (Math.abs(value) < TWO_POW_52) {
// We split the value in two:
// high part, which is a mathematical integer,
// and the rest, for which we can get rid of the
// post coma digits by casting into an int.
double highPart = ((int)(value * TWO_POW_N26)) * TWO_POW_26;
if (value > 0.0) {
return highPart + (double)((int)(value - highPart));
} else {
double anteComaDigits = highPart + (double)((int)(value -
highPart));
if (value != anteComaDigits) {
return anteComaDigits - 1.0;
} else {
return anteComaDigits;
}
}
} else { // abs(value) >= 2^52, or value is NaN
return value;
}
}
public static double ceil(double value) {
return -floor(-value);
}
}
Jeff