Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 检验两个对偶的近似相等性_Math_Double - Fatal编程技术网

Math 检验两个对偶的近似相等性

Math 检验两个对偶的近似相等性,math,double,Math,Double,考虑到这两个双值 double d1 = 1.0E-24; double d2 = 1.0000000000000029E-24; 和下面的函数 public static boolean isEqual(double d0, double d1, double epsilon) { return d0 == d1 ? true : Math.abs(d0 - d1) < epsilon; } 将epsilon设为常数,例如:public static final doub

考虑到这两个双值

double d1 = 1.0E-24;
double d2 = 1.0000000000000029E-24;  
和下面的函数

public static boolean isEqual(double d0, double d1, double epsilon) {
    return d0 == d1 ? true : Math.abs(d0 - d1) < epsilon;
}

将epsilon设为常数,例如:
public static final double epsilon=[无论阈值是什么]
epsilon不应该是你必须计算的东西,它应该是一个常数阈值,表示“如果两个double之间的差值小于此阈值,它们就足够相等了。”好的,我知道了,谢谢。但假设我想选择一个ε,使得两个双精度的至少n位相等。因为一个double有一个52位尾数,所以我想传递一个48-51位之间的变量epsilon。在这种情况下如何计算epsilon?要进行逐位计算,您需要使用双对象方法doubleToLongRawBits中的一个方法:
Double.doubleToLongRawBits(d1)
请参阅此处的文档查看我编辑的postMake epsilon常量,例如:
public static final Double epsilon=[无论阈值是什么]
Epsilon不应该是你必须计算的东西,它应该是一个恒定的阈值,表示“如果两个double之间的差值小于这个阈值,那么它们就足够相等了。”好的,我知道了,谢谢。但假设我想选择一个ε,使得两个双精度的至少n位相等。因为一个double有一个52位尾数,所以我想传递一个48-51位之间的变量epsilon。在这种情况下如何计算ε?要进行逐位计算,您需要使用双对象方法doubleToLongRawBits中的一种方法:
Double.doubleToLongRawBits(d1)
请参阅此处的文档请参阅我编辑的文章
isEqual(getMantissaLongBits(d1), getMantissaLongBits(d2), epsilon(getMantissaLongBits(d1), getMantissaLongBits(d2),49))? 

private static long getMantissaLongBits(double x) {
    return Double.doubleToRawLongBits(x) & 0x000fffffffffffffL;
}

public static double epsilon(final double one, final double other, final int bits) {
    return Math.max(Math.scalb(Math.max(Math.abs(one), Math.abs(other)), -bits),
            Math.scalb(Double.MIN_NORMAL, 52 - bits));
}