float与double类型的范围和精度

来源:互联网 发布:stc单片机pwm输出频率 编辑:程序博客网 时间:2024/05/02 03:08

转自:http://www.cnblogs.com/tekson/archive/2009/07/16/1524604.html
         http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html
         http://docs.oracle.com/cd/E19059-01/stud.8/817-5810/817-5810.pdf

0 背景知识
根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:
  V = (-1)^s×M×2^E
  (1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
  (2)M表示有效数字,大于等于1,小于2。因为整数肯定是1,所以保存时忽略1,计算时再加1。
  (3)2^E表示指数位。

例如:十进制0.1的二进制为:0.000110011001100110011001100‬11001100...
按照上面规格化要求,改成1.1001100110011001100*2^(-4)
32位浮点float表示0x3DCCCCCC,实际VC编译后对应的是0x3DCCCCCD,应该和无法整除数值的进位取舍有关,对应‭二进制:0,01111011,10011001100110011001101‬,其中
‭符号位:0 
指数位:01111011 = -4   2^(-4)=0.0625
尾数为:100 1100 1100 1100 1100 1101‬ = 5033165/(2^23) = 5033165 / 8388608 =0.6000000238418579
分别将各部分对应的十进制相乘1*0.0625*(1+0.6000000238418579)=0.10000000149011611875

1 内存分配
每个float类型4字节,double类型8字节,以科学计数法的指数+尾数形式表示,
具体分布如下(高位在前,低位在后):
float(共32位)    :1bit(符号位)  8bits(指数位) 23bits(尾数位)
double(共64位):1bit(符号位)11bits(指数位) 52bits(尾数位)
以float类型为例:0x00000000表示0,0x80000000表示-0,即最高位为符号位

2 范围
float和double的范围是由指数的位数来决定的。
float的指数位有8位,而double的指数位有11位。于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位float(+127)double(+1023)的形式来表示的(IEEE745)。
以float类型为例,十进制1的float类型指数为01111111(即0+127),2的指数为10000000(即1+127),3也是10000000(即1+127),4为10000001(即2+127)
负指数(小于127)决定了所能表达的绝对值最小的非零数;而正指数决定了所能表达的绝对值最大的数,即范围。

float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;
double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

3 精度
以 IEEE 单精度格式表示的 a 具有多少个有效十进制数字;或者当用户以 IEEE 单精度 格式表示 x 时,可以确信有多少十进制数字是准确的? 
有效十进制数字的个数始终介于 6 和 9 之间,即至少有 6 个数字是准确的,但准确数字不会超过 9 个 (如果转换是准确的,则准确数字个数不受此限制,此时可能有无限多个准确数字)。
相反,如果将 IEEE 单精度格式的二进制数转换为十进制数,然后再将其转换回二进制,则通常需要使用至少 9 个十进制数字,以确保经过两次转换后仍可以得到原始的数字。
双精度有效十进制数字的个数介于15和17之间。

原文地址:http://blog.sina.com.cn/s/blog_671c54fe0102vm8r.html

0 0
原创粉丝点击