Java 为什么double具有特定的值范围?(爪哇)

Java 为什么double具有特定的值范围?(爪哇),java,double,Java,Double,为什么Java中的double具有从±5,0*10(^-324)到±1,7*10(^308)的特定值范围?我是说为什么它不像±5,0*10(^-324)到±5,0*10(^308)或者±1,7*10(^-324)到±1,7*10(^308) 您的问题的答案是低于正常值的数字,请查看以下链接 Java中的双浮点数基于IEEE 754中定义的格式 有关说明,请参见此链接 下面是一组简单的规则 浮点数用64位表示 64位被分成以下几部分 符号位:1位(数字的符号) 指数:11位(有符号) 有效位精

为什么Java中的double具有从
±5,0*10(^-324)
±1,7*10(^308)
的特定值范围?我是说为什么它不像
±5,0*10(^-324)
±5,0*10(^308)
或者
±1,7*10(^-324)
±1,7*10(^308)

您的问题的答案是低于正常值的数字,请查看以下链接

Java中的双浮点数基于IEEE 754中定义的格式

有关说明,请参见此链接

下面是一组简单的规则

  • 浮点数用
    64位表示
  • 64位被分成以下几部分
  • 符号位:
    1位
    (数字的符号)
  • 指数:
    11位
    (有符号)
  • 有效位精度(分数):
    52位
  • 我们从该设置中获得的编号范围为

    -1022 <= Exponent <= 1023 (total 2046) (excluding 0 and 2047, they have special meanings)
    
    
    000 (0 in base 16) is used to represent a signed zero (if F=0) and subnormals (if F≠0); and
    7ff (2047 in base 16) is used to represent ∞ (if F=0) and NaNs (if F≠0),
    
    因此范围变为[-2.225*10(−308),1.797*10^308]

    此范围因以下原因而改变:

    次正常数是小于最小正常数的数 由规范定义的编号

    如果我有一个数字
    0.00123
    ,它将表示为
    1.23*10^(-3)
    。根据规范,浮点数没有前导零。因此,如果有一个带前导零的数字,它将添加到默认的
    指数
    。所以,如果我有一个指数最小的数字,前导零可能和负指数相加

    52
    位用于
    符号和(分数)
    ,因此二进制中前导零的最大数量可以是
    51
    。有效地产生以下数字

    Min positive Subnormal = 1 * 2^-52 * (2^-1022) = 2^(-2074) ≈ 4.9·10^(−324)
    
    Note: 1074 * Math.log(2) / Math.log(10) = 323.306
          Math.pow(10, 1 - 0.306) = 4.943
    
    所以你有了它,射程是现在

    [-最小次正常数,+最大正常数]


    [-4.9*10^(−324),+1.79769*10^308]

    因为IEEE-754就是这样指定的:如果它没有特定的范围,那么就不可能表示双精度。(你不能用有限的内存来表示无限大的数字。)看看我的答案,我花了一些时间才找到:)
    Min positive double = +1 * 2^(-1022) ≈ 2.225 * 10(−308)
    Note: 1022 * Math.log(2) / Math.log(10) = 307.652
          and Math.pow(10, 1 - .652) = 2.228 (.652 is approximation)
    
    Max positive double = +(2^52) * (2^1023) = 1.797 * 10^308
    
    Min positive Subnormal = 1 * 2^-52 * (2^-1022) = 2^(-2074) ≈ 4.9·10^(−324)
    
    Note: 1074 * Math.log(2) / Math.log(10) = 323.306
          Math.pow(10, 1 - 0.306) = 4.943