JAVA';s Double.MIN_值、IEEE 754和Google';什么是计算器?

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显然什么时候有这样的数字?(我知道人们不这么认

谷歌计算器能计算的最小非零数字似乎是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显然什么时候有这样的数字?(我知道人们不这么认为 每天使用它们,但编程语言仍然允许)
  • 在JAVA中,如果Double.MIN_值==4.9E-324,那么考虑到(4.9E-5+4.9E-5)==9.8E-5,为什么(Double.MIN_值+Double.MIN_值)==1.0E-323而不是9.8E-324
  • 为了使Double.MIN_值等于零,我应该加多少 以下是我针对这些问题制定的计划:

    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);
    
        }
    }
    
    
    编辑:按要求删除后续问题

  • 与其“在这里和互联网上阅读”,不如看看Javadoc:

    即,其最后一位为1,其余为0

  • 2^-1023实际上不是那里的最小值,您可以将
    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
    一样

  • JAVA的Double.MIN_值与IEEE 754的最小非零数定义有何关系?有这样的事吗

    例如,你应该仔细阅读一本关于FP编号的好教程。“正常”数字最小值为2^-1023。但IEEE-754也有最小值为2^-1074的“次正常”(或非正常)数。这些数字可能会更小,但会严重降低精度

    为什么谷歌的计算器不能计算小于2^-1023的数字,而显然存在这样的数字?(我知道人们不是每天都使用它们,但编程语言还是允许的)

    并非所有硬件都支持非规范数字,并且当支持使用这些数字时,会带来很高的时间成本(例如,在奔腾操作符上,正常数字的延迟为~5,但如果结果或一个操作数低于正常值,则延迟可以>100)。这可能就是谷歌不支持次正常的原因(但这只是一个假设)。FP库和硬件有一个均值来考虑次法线数为零。 在JAVA中,如果Double.MIN_值==4.9E-324,那么考虑到(4.9E-5+4.9E-5)==9.8E-5,为什么(Double.MIN_值+Double.MIN_值)==1.0E-323而不是9.8E-324

    打印值四舍五入并以二进制显示。2^-1023的整数部分的精确值比4.9的小数多得多。它的双倍也是一样的。这是一个展示的问题

    为了使Double.MIN_值等于零,我应该加多少

    只需减去它本身。

    您可以在任何搜索引擎中输入这些搜索词,而不是“阅读和跨互联网”:

    IEEE 754 1074

    你可以在维基百科上找到以下文章对此进行了很好的解释:

    :

    双精度 双精度数字占用64位。双倍 精度:

    • 最接近零的正数和负数(由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

    :

    请注意,在上表中,列出的最小指数适用于正常数字;特殊的次正常数字表示允许表示更小的数字(精度有所降低)。例如,二进制64中可以表示的最小正数是2^−1074(因为1074=1022+53− 1)


    只有在搜索引擎中输入,谷歌计算器才能计算
    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)。