JAVA';s Double.MIN_值、IEEE 754和Google';什么是计算器?
谷歌计算器能计算的最小非零数字似乎是2^-1023。即2^-1024等于0 在JAVA中,Double.MIN_值为2^-1074 当阅读JAVA的Double.MIN_值时,在这里和互联网上有很多人提到IEEE 754,但实际上没有人说2^-1074是IEEE 754中定义的最小非零数字 因此,我的问题是:JAVA';s Double.MIN_值、IEEE 754和Google';什么是计算器?,java,math,ieee-754,Java,Math,Ieee 754,谷歌计算器能计算的最小非零数字似乎是2^-1023。即2^-1024等于0 在JAVA中,Double.MIN_值为2^-1074 当阅读JAVA的Double.MIN_值时,在这里和互联网上有很多人提到IEEE 754,但实际上没有人说2^-1074是IEEE 754中定义的最小非零数字 因此,我的问题是: JAVA的Double.MIN_值与IEEE 754的 最小的非零数?有这样的事吗 为什么谷歌的计算器不能计算比谷歌更小的数字 2^-1023显然什么时候有这样的数字?(我知道人们不这么认
public class Lecture {
public static void main(String[] args) {
double min = Double.MIN_VALUE;
double max = Double.MAX_VALUE;
double minPlusOne = min + 0.0001;
System.out.println("Min + 1: " + minPlusOne);
System.out.println("Double.MIN_VALUE: " + min);
System.out.println("Double.MIN_VALUE: " + max);
double myMin = Math.pow(2, -1074);
System.out.println("2^-1074: " + myMin);
System.out.println("Double.MIN_VALUE == 2^-1074: " + (min == myMin));
System.out.println();
System.out.println("Changed Min:" + (min + min));
double a = 4.9E-5;
double b = a + a;
System.out.println(b);
}
}
编辑:按要求删除后续问题
Double.MIN_值
作为(2^-1023)/2^51
。不知道谷歌的开发者为什么让2^-1024
返回0,你得问问他们Double.MIN_值
如文件所述为2^-1074。它不等于4.9*10^-324,它只是按照以下方式打印的。对于Double.MIN_值
和2*Double.MIN_值
的四舍五入恰好朝着不同的方向进行-Double.MIN_值
,就像您要添加的任何其他双d
一样- 最接近零的正数和负数(由Exp字段中所有0的非规范化值和分数字段中的二进制值1表示)为 ±2^−1074≈ ±4.94066×10^−324
- 最接近零的正数和负数规格化数(在Exp字段中用>二进制值1表示,在分数字段中用0表示)如下 ±2^−1022≈ ±2.22507×10^−308
- 距离零最远的有限正数和有限负数>为 ±(1)−2^−53) × 2^1024 ≈ ±1.79769×10^308
只有在搜索引擎中输入,谷歌计算器才能计算
2^-1074
。如果我打开计算器(通过输入“2+2”作为搜索词),我可以输入“2^-1074”作为表达式,它会尽职尽责地报告“5e-324”(使用与java略有不同的舍入),请不要将其他问题编辑为问题。改为问新问题。但是,您的第一个额外问题是由于浮点运算中发生的正常舍入。你的第二个额外问题措辞不清楚。Integer.MAX_VALUE
与Integer.MIN_VALUE-1
之间的关系很大程度上是偶然的,因为它们是如何编码的,而浮点编码本身并不适用于此。当我使用bigdecime
进行试验时,您所说的话变得更加明显。因此,当我向我的程序中添加以下内容时,我看到了它的工作原理:bigdecimalmybigdecimal=newbigdecimal(min+min)代码>最小的正常态数实际上是2^-1022,而不是1023(请参阅Java或Java中的Double.MIN_normal doc)。