单精度浮点数 float 在计算机中占4个字节,用32位二进制来描述。

双精度浮点数 double 在计算机中占8个字节,用64位二进制来描述。

浮点数在计算机中采用指数形式表示,并分解为:符号,尾数,指数符号,指数四个部分。

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

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

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

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

指数占多少位,尾数占多少位,由计算机系统决定。

可能是符号加尾数占24位,指数符号加指数占8位 — float

符号加尾数占48位,指数符号加指数占16位 — double

了解了这四个部分的占位,按二进制估计大小范围,再换算为十进制,即为您想要的数值范围。

对于编程人员而言,double 和 float 的区别在于 double 的精度更高,有效位数为16位,而 float 的精度为7位。但是 double 消耗的内存是 float 的两倍,double 的运算速度远远比 float 慢,在 C 语言中数学函数的名称 double 和 float 不同,不要写错,并且在可以使用单精度时不要使用双精度(以节省内存,加快运算速度)。

类型比特数有效数字数值范围float326-7-3.410(-38)~3.410(38)double6415-16-1.710(-308)~1.710(308)long double12818-19-1.210(-4932)~1.210(4932)

简单来说,Float 为单精度,内存中占4个字节,有效数位为7位(因为有正负,所以不是8位),在我的电脑和 VC++6.0 平台中默认显示为6位有效数字;double 为双精度,占8个字节,有效数位为16位,但在我的电脑和 VC++6.0 平台中默认显示同样为6位有效数字。

例如:在 C 和 C++ 中,如下赋值语句:

编译器报错:warning C4305: ‘initializing’ : truncation from ‘const double ‘ to ‘float ‘

原因: 在 C/C++ 中(也不知道是不是就在 VC++ 中这样),上述语句等号右边 0.1,我们以为它是 float,但是编译器却把它认为是 double(因为小数默认为 double),所以会报这个警告,一般改成 0.1f 就没事了。

本人通常的做法,经常使用 double,而不喜欢使用 float。

C 语言和 C 语言中,对于浮点类型的数据使用单精度类型 float 和双精度类型 double 来存储,float 数据占用32位,double 数据占用64位,我们在声明一个变量 float f= 2.25f 的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是 float 还是 double 在存储方式上都遵从 IEEE 的规范,float 遵从的是 IEEE R32.24,而 double 遵从的是 R64.53。

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

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

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

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

Java 接口和多态 →