双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。
C语言中,双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。这些数据是怎么算出来的?
看了很多答案,貌似都算的不对。。。。。
参考答案:3月21日补充:
阶码为0X3FF + 真实指数
所以最大的只能是0X7FF,但是0X7FF被当作溢出了,所以最大是0X7FE
也就是1023,最小的就是-1023
后面讲解中的阶码最大为1024是错的!
应该是这样
尾数约等于1,再加上一个默认的1 就是约等于2 ,于是最大的数就是约2*2^1023 = 2^1024 得那个数
下面的程序将说明问题
#include <iostream>
using namespace std;
union
{
struct
{
int a;
int b;
} i;
double d;
} num;
void main( )
{
num.i.a = 0xffffffff;
num.i.b = 0x7fefffff;//double最大的数
cout<<num.d<<endl;
}
符号位1位,阶码11位,尾数52位
当然最大数就是
符号位 正数
阶码 11位,最大的是 100 0000 0000 (1024 ,表示的指数范围是-1023到1024,所以最大的是这个了)
而2^1024 约 1.79e308
尾数是有效数字
上面的最大的为 100 0000 0000是错的
应该是0x7fe 表示:2的0x3ff次方 (0x7ff表示2的0x400方,但是有特殊含义,所以最大的是2的0x3ff次方)
-----------------------
一般机器规定,若基为2并用补码表示尾数,则规格化数的标志为:“尾数的符号位和数值部分最高位具有不同的代码”。
为了最大限度提高精度,尾数采用规格化形式,既1/2≤M<1。采用二进制表示时,若尾数大于零,则规格化数应该是01XXXX的形式;若尾数小于零,则规格化数应为10XXXX的形式。
-----------------------
也是有问题的,那个不是标准的
"为便于软件的移植,浮点数的表示格式应该有统一标准。1985年IEEE(Institute of Electrical and Electronics Engineers)提出了IEEE754标准。该标准规定基数为2,阶码E用移码表示,尾数M用原码表示,根据原码的规格化方法,最高数字位总是1,该标准将这个1缺省存储,使得尾数表示范围比实际存储的一位"
所以尾数的真值就是0.????尾数(二进制的,比如0.1就是十进制0.5) 再加上 1
所以上面程序中的意思就是
一个趋于1的数(0.ffffffffffff + 1) * 2^1023 约 2^1024
所以最大的是那么多了.......
而负数则同理