/* 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)); }
// 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; }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCVN5c3RlbS5vdXQucHJpbnRsbihpc0V4YWN0RmxvYXQoMC4yNCkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpc0V4YWN0RmxvYXQoMC4yNSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpc0V4YWN0RmxvYXQoMC41KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGlzRXhhY3RGbG9hdCgxLjI1KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGlzRXhhY3RGbG9hdCgyLjEyNSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpc0V4YWN0RmxvYXQoMy4zMTI1KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGlzRXhhY3RGbG9hdCg2LjA5Mzc1KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGlzRXhhY3RGbG9hdCg3LjEwOTM3NSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpc0V4YWN0RmxvYXQoOS42MTcxODc1KSk7Cgl9CgoJLy8gRGV0ZXJtaW5lIHdoZXRoZXIgbnVtYmVyIGlzIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBpbiBkb3VibGUuCgkvLyBpLmUuLCBObyByb3VuZGluZyB0byBhbiBhcHByb3hpbWF0aW9uIGR1cmluZyB0aGUgY29udmVyc2lvbi4KCS8vIFJlc3VsdHMgYXJlIHZhbGlkIGZvciBudW1iZXJzIGluIHRoZSByYW5nZSBbMl4tMjQsIDJeNTJdLgoKCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4YWN0RmxvYXQoZG91YmxlIHZhbCkgewoJCiAgICAgICAgaW50IGV4cDIgPSBNYXRoLmdldEV4cG9uZW50KHZhbCk7CiAgICAgICAgaW50IGV4cDEwID0gKGludCkgTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKHZhbCkpKTsKCiAgICAgICAgLy8gY2hlY2sgZm9yIGFueSBtaXNtYXRjaCBiZXR3ZWVuIHRoZSBleGFjdCBkZWNpbWFsIGFuZAogICAgICAgIC8vIHRoZSByb3VuZC10cmlwIHJlcHJlc2VudGF0aW9uLgogICAgICAgIGludCByaWdodG1vc3RfYml0cyA9ICg1MiAtIGV4cDIpIC0gKDE2IC0gZXhwMTApOwoKICAgICAgICAvLyBjcmVhdGUgYml0bWFzayBmb3IgcmlnaHRtb3N0IGJpdHMKICAgICAgICBsb25nIG1hc2sgPSAoMUwgPDwgcmlnaHRtb3N0X2JpdHMpIC0gMTsKCiAgICAgICAgLy8gdGVzdCBpZiBhbGwgcmlnaHRtb3N0IGJpdHMgYXJlIDAncyAoaS5lLiwgbm8gcm91bmRpbmcpCiAgICAgICAgcmV0dXJuIChEb3VibGUuZG91YmxlVG9Mb25nQml0cyh2YWwpICYgbWFzaykgPT0gMDsKICAgIH0KfQo=