浮点数类型在计算机内存中使用不同的方式进行存储,其中单精度浮点数float占用32位二进制,双精度浮点数double占用64位二进制。

float类型

浮点数在机内使用指数型式表示,包含数符,尾数,指数符,指数四个部分。

数符占1位二进制,表示数的正负。

指数符占1位二进制,表示指数的正负。

尾数表示浮点数有效数字,0.xxxxxxx,但不存储开头的0和小数点。

指数存储指数的有效数字。

指数和尾数的位数由计算机系统决定。

单精度浮点数float可能由数符和尾数组成的24位,和指数符和指数组成的8位。

双精度浮点数double可能由数符和尾数组成的48位,和指数符和指数组成的16位。

根据这四个部分的位数,将二进制估算为十进制以获得数值范围。

对于编程人员而言,双精度float和单精度float的区别在于双精度float的精度高,有效数字为16位,而单精度float的精度为7位。但是双精度float的内存消耗是单精度float的两倍,且计算速度远不及单精度float。在C语言中,数学函数的名称不同,使用时务必注意。当可以使用单精度时,尽量避免使用双精度,以节省内存,提升计算速度。

以下是不同浮点数类型的位数及有效数字范围:

类型位数有效数字数值范围
float326-73.410(-38)~3.410(38)
double6415-161.710(-308)~1.710(308)
long double12818-191.210(-4932)~1.210(4932)

简而言之,单精度浮点数float占用4个字节,在内存中有效数字为7位(去除一位作为符号位)。双精度浮点数double占用8个字节,有效数字为16位(同样去除一位作为符号位)。在我的电脑上,且VC++6.0平台中,默认显示为6位有效数字。

例如,在C和C++中,以下赋值语句将会出现编译器警告:warning C4305: ‘initializing’ : truncation from ‘const double ‘ to ‘float ‘

原因:在C/C++中(也不知道是不是就在VC++中这样),上述语句中的等号右侧为0.1,我们认为它是单精度浮点数,但是编译器却将其视为双精度浮点数(因为小数默认是双精度),因此会发出警告。一般将其改为0.1f即可解决。

我通常的做法是经常使用双精度浮点数double,而不喜欢使用单精度浮点数float。

在C语言和C语言中,采用单精度类型float和双精度类型double来存储浮点数。其中,float数据占用32位,double数据占用64位。在声明变量时,如float f= 2.25f,内存分配方式如何呢?事实上,无论是float还是double,在存储方式上都遵循IEEE的规范,float遵从IEEE R32.24,而double遵从IEEE R64.53。

无论是单精度还是双精度,在存储中都分为三个部分:

  • 符号位(Sign):0代表正,1表示负。
  • 指数位(Exponent):用于存储科学计数法中的指数数据,采用移位存储。
  • 尾数部分(Mantissa):尾数部分。

来源地址:https://my.oschina.net/zd370982/blog/724265

← C/C++ 获取键盘事件

Java 接口和多态 →