代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

进行双值相等比较时,epsilon值应该是什么?

  •  21
  • Cheok Yan Cheng  · 技术社区  · 14 年前

    下面是下面程序的输出。

    value is : 2.7755575615628914E-17
    Double.compare with zero : 1
    isEqual with zero : true
    

    我的问题是,什么应该是epsilon值?是否有任何可靠的方法来获得价值,而不是从天空中挑选一个数字。


    package sandbox;
    
    /**
     *
     * @author yccheok
     */
    public class Main {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            double zero = 1.0/5.0 + 1.0/5.0 - 1.0/10.0 - 1.0/10.0 - 1.0/10.0 - 1.0/10.0;
            System.out.println("value is : " + zero);
            System.out.println("Double.compare with zero : " + Double.compare(zero, 0.0));
            System.out.println("isEqual with zero : " + isEqual(zero, 0.0));
        }
    
        public static boolean isEqual(double d0, double d1) {
            final double epsilon = 0.0000001;
            return d0 == d1 ? true : Math.abs(d0 - d1) < epsilon;
        }
    }
    
    6 回复  |  直到 7 年前
        1
  •  8
  •   mob    14 年前

    public static void main(String[] args) {
        double z = 0.0;
        double x = 0.23;
        double y = 1.0 / x;
        int N = 50000;
        for (int i = 0; i < N; i++) {
            z += x * y - 1.0;
        }
        System.out.println("z should be zero, is " + z);
    }
    

    ~5.55E-12 N

        2
  •  11
  •   Alexandre C.    12 年前

    bool fuzzyEquals(double a, double b)
    {
        return abs(a - b) < eps * max(abs(a), abs(b));
    }
    

        3
  •  8
  •   Jerry Coffin    14 年前

    isEqual isNearlyEQual isEqual(a, c) isEqual(a, b) isEqual(b, c)

        4
  •  7
  •   Hejazi    10 年前

    isEqual

    epsilon = Math.max(Math.ulp(d0), Math.ulp(d1))
    

    http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html#ulp%28double%29

        5
  •  1
  •   Richard Gomes    7 年前

    1. Double.ulp()
    2. double d Double.ulp(d)

    disastrous examples here

    doubles floats

    fixed point arithmetic

        6
  •  1
  •   Geoff Reedy    7 年前

    https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

    java.lang.Double#doubleToLongBits java.lang.Float#floatToIntBits ulp(double) ulp(float) nextUp(double) nextUp(float) nextAfter(double, double) nextAfter(float, float)