FileDocCategorySizeDatePackage
FloatCmp.javaAPI DocExample1485Sun Feb 08 21:33:56 GMT 2004None

FloatCmp.java

/**
 * Floating-point comparisons.
 * @author Ian F. Darwin, http://www.darwinsys.com/
 * @version $Id: FloatCmp.java,v 1.11 2004/02/09 03:33:56 ian Exp $
 */
public class FloatCmp {
	final static double EPSILON = 0.0000001;
	public static void main(String[] argv) {
		double da = 3 * .3333333333;
		double db = 0.99999992857;

		// Compare two numbers that are expected to be close.
		if (da == db) {
			System.out.println("Java considers " + da + "==" + db);
		// else compare with our own equals method
		} else if (equals(da, db, 0.0000001)) {
			System.out.println("True within epsilon " + EPSILON);
		} else {
			System.out.println(da + " != " + db);
		}

		// Show that comparing two NaNs is not a good idea:
		double d1 = Double.NaN;
		double d2 = Double.NaN;
		if (d1 == d2)
			System.err.println("Comparing two NaNs incorrectly returns true.");
		if (!new Double(d1).equals(new Double(d2)))
			System.err.println("Double(NaN).equal(NaN) incorrectly returns false.");
	}

	/** Compare two doubles within a given epsilon */
	public static boolean equals(double a, double b, double eps) {
		if (a==b) return true;
		// If the difference is less than epsilon, treat as equal.
		return Math.abs(a - b) < eps;
	}

	/** Compare two doubles, using default epsilon */
	public static boolean equals(double a, double b) {
		if (a==b) return true;
		// If the difference is less than epsilon, treat as equal.
		return Math.abs(a - b) < EPSILON * Math.max(Math.abs(a), Math.abs(b));
	}
}