Java 为什么double具有特定的值范围?(爪哇)
为什么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位(有符号) 有效位精
±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位表示
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