/* This code is a a heavily modified version of Numbers from Rich Hickeys clojure core, see Numbers.java for copyright */ package com.googlecode.totallylazy.numbers; import java.math.BigDecimal; public final class DoubleOperators implements Operators<Double> { public static DoubleOperators Instance = new DoubleOperators(); private DoubleOperators() {} public final Class<Double> forClass() { return Double.class; } public final int priority() { return 7; } @Override public Number absolute(Double value) { return Math.abs(value); } public final Number negate(Double value) { return -value; } public final Number increment(Double value) { return value + 1; } public final Number decrement(Double value) { return value - 1; } public final boolean isZero(Double value) { return value == 0; } public final boolean isPositive(Double value) { return value > 0; } public final boolean isNegative(Double value) { return value < 0; } public final boolean equalTo(Number x, Number y) { return x.doubleValue() == y.doubleValue(); } public final boolean lessThan(Number x, Number y) { return x.doubleValue() < y.doubleValue(); } public final Number add(Number x, Number y) { return x.doubleValue() + y.doubleValue(); } public final Number multiply(Number x, Number y) { return x.doubleValue() * y.doubleValue(); } public final Number divide(Number x, Number y) { return x.doubleValue() / y.doubleValue(); } public final Number quotient(Number x, Number y) { return quotient(x.doubleValue(), y.doubleValue()); } public final Number remainder(Number x, Number y) { return remainder(x.doubleValue(), y.doubleValue()); } public static Number quotient(double n, double d) { double q = n / d; if (q <= Integer.MAX_VALUE && q >= Integer.MIN_VALUE) { return (int) q; } else { return BigIntegerOperators.reduce(new BigDecimal(q).toBigInteger()); } } public static Number remainder(double n, double d) { double q = n / d; if (q <= Integer.MAX_VALUE && q >= Integer.MIN_VALUE) { return (n - ((int) q) * d); } else { Number bq = BigIntegerOperators.reduce(new BigDecimal(q).toBigInteger()); return (n - bq.doubleValue() * d); } } public static Number rationalize(Double x) { return BigDecimalOperators.rationalize(BigDecimal.valueOf(x)); } }