(156)单精度和双精度浮点数数据类型详解
单精度和双精度浮点数数据类型
C、C++中使⽤到的单精度浮点数(float)类型和双精度浮点数(double)类型是在IEEE⼆
进制浮点数算术标准
进制浮点数算术标准(ANSI/IEEE Std 754-1985)中定义的。下⾯分别从存储格式、内存分
布、编码规则、取值范围、有效数字位数和测试⽰例程序六个部分来详细说明。
存储格式
浮点数在计算机中存储时,按照⼆进制科学计数法拆分为三个部分:符号位、指数部分和尾
数部分。如下图所⽰:
存储时,按照最⾼位存储符号位,次⾼位存储指数部分,低位存储尾数部分的次序存储。存
储时的排列⽰意图如下:
内存分布
float类型和double类型的各部分在内存中的存储空间占⽤如下表:
float类型的内存分布如下图所⽰:
double类型的内存分布如下图所⽰:
编码规则
在实际存储时要对使⽤⼆进制科学计数法表⽰的浮点数值的符号位、指数部分和尾数部分进
⾏编码处理。⼀般需要分为规约形式的浮点数、⾮规约形式的浮点数和特殊值三种类型进⾏编
码。其编码前后处理如下图所⽰:
注:⾮规约浮点数主要⽤于扩⼤0值附近的浮点数表⽰范围,⾮规约浮点数的绝对值均⼩于
规约浮点数的绝对值,即前者在实数轴上更靠近0,这样可以提⾼0附近的计算精度;⼀般C、
C++中float和double的取值范围都是按照规约浮点数定义的,MSDN⽂档和相关教材也是这么说的,但部分编译器按照ANSI/IEEE Std 754-1985标准实现了⾮规约浮点数,本⽂末尾留有程序
⽰例说明。
符号位:0表⽰正数,1表⽰负数;
指数部分: float的偏移量为2^8 - 1,double的偏移量为2^11 - 1;
尾数部分:实际尾数部分中的⼩数点后的数值,规约浮点数使⽤标准的⼆进制科学计数法表⽰,其尾数范围在 [1,2),⾮规约浮点数的尾数部分范围在(0,1)。
下⾯以规约浮点数8.5为例,来说明浮点数的编码过程:
取值范围
单精度浮点数的各种极限值和取值范围如下图所⽰:
双精度浮点数的各种极限值和取值范围如下图所⽰:
有效数字位数
因为有效数字位数只与位数有关,所以只要计算出⼗进制表⽰的尾数中有效数字位数就能知道该浮点数的有效数字位数。
注:在接近0、正⽆穷、负⽆穷等极限值时,有效数字不能保证为上述精度。
测试⽰例程序
float数值范围浮点数据表⽰测试可以通过IEEE-754 Analysis⽹页在线测试,也可以通过⾃⼰编写的
C\C++程序来测试。
⼀下是在Visual Studio 2010下编写的C++测试代码:
输出结果如下:
从上述结果可以看出编译器已经实现了ANSI/IEEE Std 754-1985标准中定义的float型和double型浮点数,⽽头⽂件定义中并未更新或修改,MSDN⽂档亦是如此。如下图: