/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
System.
out.
println(isExactFloat
(0.24)); System.
out.
println(isExactFloat
(0.25)); System.
out.
println(isExactFloat
(0.5)); System.
out.
println(isExactFloat
(1.25)); System.
out.
println(isExactFloat
(2.125)); System.
out.
println(isExactFloat
(3.3125)); System.
out.
println(isExactFloat
(6.09375)); System.
out.
println(isExactFloat
(7.109375)); System.
out.
println(isExactFloat
(9.6171875)); System.
out.
println(isExactFloat
(1234567.125)); }
// Determine whether number is exactly representable in double.
// i.e., No rounding to an approximation during the conversion.
// Results are valid for numbers in the range [2^-24, 2^52].
public static boolean isExactFloat(double val) {
int exp2
= Math.
getExponent(val
);
// check for any mismatch between the exact decimal and
// the round-trip representation.
int rightmost_bits = (52 - exp2) - (16 - exp10);
// create bitmask for rightmost bits
long mask = (1L << rightmost_bits) - 1;
// test if all rightmost bits are 0's (i.e., no rounding)
return (Double.
doubleToLongBits(val
) & mask
) == 0; }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCVN5c3RlbS5vdXQucHJpbnRsbihpc0V4YWN0RmxvYXQoMC4yNCkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpc0V4YWN0RmxvYXQoMC4yNSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpc0V4YWN0RmxvYXQoMC41KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGlzRXhhY3RGbG9hdCgxLjI1KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGlzRXhhY3RGbG9hdCgyLjEyNSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpc0V4YWN0RmxvYXQoMy4zMTI1KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGlzRXhhY3RGbG9hdCg2LjA5Mzc1KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGlzRXhhY3RGbG9hdCg3LjEwOTM3NSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpc0V4YWN0RmxvYXQoOS42MTcxODc1KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGlzRXhhY3RGbG9hdCgxMjM0NTY3LjEyNSkpOwoJfQoKCS8vIERldGVybWluZSB3aGV0aGVyIG51bWJlciBpcyBleGFjdGx5IHJlcHJlc2VudGFibGUgaW4gZG91YmxlLgoJLy8gaS5lLiwgTm8gcm91bmRpbmcgdG8gYW4gYXBwcm94aW1hdGlvbiBkdXJpbmcgdGhlIGNvbnZlcnNpb24uCgkvLyBSZXN1bHRzIGFyZSB2YWxpZCBmb3IgbnVtYmVycyBpbiB0aGUgcmFuZ2UgWzJeLTI0LCAyXjUyXS4KCglwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeGFjdEZsb2F0KGRvdWJsZSB2YWwpIHsKCQogICAgICAgIGludCBleHAyID0gTWF0aC5nZXRFeHBvbmVudCh2YWwpOwogICAgICAgIGludCBleHAxMCA9IChpbnQpIE1hdGguZmxvb3IoTWF0aC5sb2cxMChNYXRoLmFicyh2YWwpKSk7CgogICAgICAgIC8vIGNoZWNrIGZvciBhbnkgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgZXhhY3QgZGVjaW1hbCBhbmQKICAgICAgICAvLyB0aGUgcm91bmQtdHJpcCByZXByZXNlbnRhdGlvbi4KICAgICAgICBpbnQgcmlnaHRtb3N0X2JpdHMgPSAoNTIgLSBleHAyKSAtICgxNiAtIGV4cDEwKTsKCiAgICAgICAgLy8gY3JlYXRlIGJpdG1hc2sgZm9yIHJpZ2h0bW9zdCBiaXRzCiAgICAgICAgbG9uZyBtYXNrID0gKDFMIDw8IHJpZ2h0bW9zdF9iaXRzKSAtIDE7CgogICAgICAgIC8vIHRlc3QgaWYgYWxsIHJpZ2h0bW9zdCBiaXRzIGFyZSAwJ3MgKGkuZS4sIG5vIHJvdW5kaW5nKQogICAgICAgIHJldHVybiAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModmFsKSAmIG1hc2spID09IDA7CiAgICB9Cn0K