前言
直至20世纪70年代末, 实数(十进制数)被不同的计算机厂商表示成不同的二进制形式, 这使得许多程序与不同的机器不兼容. 1980年IEEE委员会将实数的浮点数据表示进行了标准化. 该标准大部分由Intel基于8087数学协处理器定制的. 认识到不同的程序需要不同的精度, 因此建立了单精度和双精度. 而今几乎所有的软件和硬件公司都遵循这些标准, 因此有必要做一些了解.
精度数字类型的目的
用于科学计算法 例如 1.3E9 表示 1300000000人口
S = 1, E=9,M=1.3 转成二进制存入硬盘或内存,CPU运算也是有优势的。减少磁盘空间计算量什么的。
或那种-0.000000002 这种的计算2E-9
S=0,E-9, M=2
IEEE-754浮点标准
经典图单双精度浮点数的IEEE标准格式
关键字:浮点数 IEEE标准
大多数高级语言按照IEEE-754标准来规定浮点数的存储格式。
IEEE-754规定 单精度浮点数用4字节存储,双精度浮点数用8字节存储,表示为三部分:符号位、阶和尾数。
S+E+M
S 符号位,尾数的符号位;
E 阶,即指数;
M 尾数,即有效小数位数;
单精度格式
符号位 1位, bit31
阶 8位,bit30~23
尾数 24位,bit22~0
双精度
符号位 1位,bit63
阶 11位,bit62~52
尾数 53位,bit51~0
省略位
二进制数的规格化表示中,小数点前的数(即二进制表示的最高位)为1,故省略之。
所以 float的M 用23位可以表示24位的值,double的M 用52位可以表示53位的值。
阶码
以移码的形式存储。对于float偏移量为127(7FH),对于double偏移量为1023(3FFH)。
存储浮点数的阶码之前,偏移量要先加到阶码上。原因如下:
float的值的二进制科学计数法表示中 阶的范围 ±127, 当一个数“无限”趋近于0,即为 浮点0.
为了保证 浮点0 与 机器0 的存储表示一样,阶在存储时加上偏移 127
eg
2^3,移码的结果 在单精度中为82H(130=3+127),在双精度中为402H(1026=3+1023)。
浮点数有两个例外
0.0存储为全零;
无限大数的阶码存储为全1,尾数部分全零,符号位指示正无穷或者负无穷。
有效位数
顾名思义,精度是指某精度范围。
float:2^23 = 8388608,一共七位,由于最左为1的一位省略了,这意味着最多能表示8位数: 28388608 = 16777216 。有8位有效数字,但绝对能保证的为7位,也即float的精度为7~8位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为16~17位。
参考
https://www.cnblogs.com/yichunguo/p/11817440.html
https://blog.csdn.net/u011277123/article/details/95774544
http://blog.chinaunix.net/uid-24118190-id-75212.html
https://www.jianshu.com/p/dd84e16cdc91
网友评论