You can see the actual accuracy of your inputs, for example, the code below the outputs:
input: 0.01000000000000000020816681711721685132943093776702880859375 range: [0.0099999999999999984734433411404097569175064563751220703125 - 0.010000000000000001942890293094023945741355419158935546875] range size: 3.4694469519536141888238489627838134765625E-18 input: 10000000000000000 range: [9999999999999998 - 10000000000000002] range size: 4
public static void main(String[] args) { printRange(0.01); printRange(10000000000000000d); } private static void printRange(double d) { long dBits = Double.doubleToLongBits(d); double dNext = Double.longBitsToDouble(dBits + 1); double dPrevious = Double.longBitsToDouble(dBits + -1); System.out.println("input: " + new BigDecimal(d)); System.out.println("range: [" + new BigDecimal(dPrevious) + " - " + new BigDecimal(dNext) + "]"); System.out.println("range size: " + new BigDecimal(dNext - dPrevious)); }
You still need to evaluate the loss of the result of your operation. And this does not work with corner cases (around Infinity, NaN, etc.).
assylias
source share