Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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
Java:将Double.MIN\u NORMAL添加到Double不会改变数字_Java_Double_Double Precision_Epsilon - Fatal编程技术网

Java:将Double.MIN\u NORMAL添加到Double不会改变数字

Java:将Double.MIN\u NORMAL添加到Double不会改变数字,java,double,double-precision,epsilon,Java,Double,Double Precision,Epsilon,我认为MIN_NORMAL是一个值,你可以把它加到一个普通的双精度上,数字就会改变。例如,将Double.MIN_NORMAL添加到0.1d,得到的值与0.1d不同,但我的理解是错误的: public static void test(double val) { if (val == (val - Double.MIN_NORMAL*1e50d)) System.out.printf("val == (val - Double.MIN_NORMAL*1e50d) for

我认为MIN_NORMAL是一个值,你可以把它加到一个普通的双精度上,数字就会改变。例如,将Double.MIN_NORMAL添加到0.1d,得到的值与0.1d不同,但我的理解是错误的:

public static void test(double val) {
    if (val == (val - Double.MIN_NORMAL*1e50d))
        System.out.printf("val == (val - Double.MIN_NORMAL*1e50d) for val=%.20f\n", val);
    else
        System.out.printf("val != (val - Double.MIN_NORMAL*1e50d) for val=%.20f\n", val);
}
产生:

test(0.0d);
> val != (val - Double.MIN_NORMAL*1e50d) for val=0.00000000000000000000

test(1.0d);
> val == (val - Double.MIN_NORMAL*1e50d) for val=1.00000000000000000000

test(0.1d);
> val == (val - Double.MIN_NORMAL*1e50d) for val=0.10000000000000000000
有人请解释一下我的逻辑,即使我加上MIN_正常时间1e50d,我仍然得到相同的数字


我检查了二进制表示,1*Double.MIN_NORMAL与2*Double.MIN_NORMAL不同,但从零以外的任何值中减去这些值都不会改变原始数字。

Double的精度有限。最小正常值为2e-1022。除非您添加的数字也在2e-1000的范围内,否则它将被删除。

双精度有限。最小正常值为2e-1022。除非您将其添加到的数字也在2e-1000的范围内,否则它将被删除。

MIN\u NORMAL是,正如Javadoc所说,只有最小的标准化双精度值。但这并不意味着整数的值类似于1:对于浮点值,没有标准的eps可以添加以更改为下一个可表示的值-eps始终取决于给定浮点值的指数。这就是为什么它们最终被称为浮点:

但是,Java1.6+提供了一个函数,它为任何给定的double返回下一个或上一个可表示的double

在较旧的Java版本上,您总是可以处理Double.Double-tolongbits,递增或递减其结果,并通过Double.longBitsToDouble转换回来;这将获得下一个或上一个可表示的双精度值-在大多数情况下:有一些特殊情况是NaN,无限值,因此不建议浮点新手使用此值:

MIN_NORMAL,正如Javadoc所说,只有最小的标准化双精度值。但这并不意味着整数的值类似于1:对于浮点值,没有标准的eps可以添加以更改为下一个可表示的值-eps始终取决于给定浮点值的指数。这就是为什么它们最终被称为浮点:

但是,Java1.6+提供了一个函数,它为任何给定的double返回下一个或上一个可表示的double


在较旧的Java版本上,您总是可以处理Double.Double-tolongbits,递增或递减其结果,并通过Double.longBitsToDouble转换回来;这将获得下一个或上一个可表示的双精度值-在大多数情况下:有一些特殊情况是NaN,无限值,因此不建议浮点新手使用此值:

明确定义为-1022的2次方。因此,相比之下,您的1e50d算不上什么。当从0中加/减时,MIN_NORMAL保证有效果,但您不能指望它有其他效果。特别是,它不会对像1.0或0.1这样的相对巨大的数字做任何事情。从除0以外的任何值减去Double.MIN_NORMAL不会改变原始值。尝试1e-300。出于某种原因,我在想,当整个零件大于0时,MIN_NORMAL是两个可表示值之间的最小距离。谢谢明确地定义为-1022的幂的2。因此,相比之下,您的1e50d算不上什么。当从0中加/减时,MIN_NORMAL保证有效果,但您不能指望它有其他效果。特别是,它不会对像1.0或0.1这样的相对巨大的数字做任何事情。从除0以外的任何值减去Double.MIN_NORMAL不会改变原始值。尝试1e-300。出于某种原因,我在想,当整个零件大于0时,MIN_NORMAL是两个可表示值之间的最小距离。谢谢谢谢你的数学。下一步,我要更改已接受的答案!谢谢你的数学。下一步,我要更改已接受的答案!