赞
踩
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 不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。
类型 | 比特数 | 有效数字 | 数值范围 |
---|---|---|---|
float | 32 | 6-7 | -3.4*10(-38)~3.4*10(38) |
double | 64 | 15-16 | -1.7*10(-308)~1.7*10(308) |
long double | 128 | 18-19 | -1.2*10(-4932)~1.2*10(4932) |
简单来说,Float 为单精度,内存中占 4 个字节,有效数位是 7 位(因为有正负,所以不是8位),在我的电脑且 VC++6.0 平台中默认显示是6位有效数字;double为 双精度,占 8 个字节,有效数位是 16 位,但在我的电脑且 VC++6.0 平台中默认显示同样是 6 位有效数字
例子:在 C 和 C++ 中,如下赋值语句:
float a=0.1;
编译器报错:warning C4305: 'initializing' : truncation from 'const double ' to 'float '
原因: 在 C/C++ 中(也不知道是不是就在 VC++ 中这样),上述语句等号右边 0.1,我们以为它是个 float,但是编译器却把它认为是个 double(因为小数默认是 double),所以要报这个 warning,一般改成 0.1f 就没事了。
本人通常的做法,经常使用 double,而不喜欢使用 float。
C 语言和 C# 语言中,对于浮点类型的数据采用单精度类型 float 和双精度类型 double 来存储,float 数据占用 32bit, double 数据占用 64bit,我们在声明一个变量 float f= 2.25f 的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是 float 还是 double 在存储方式上都是遵从 IEEE 的规范 的,float 遵从的是 IEEE R32.24 ,而 double 遵从的是 R64.53。
无论是单精度还是双精度在存储中都分为三个部分:
2
C++ 中 float 与 double 类型的精度区别
double 精度高,有效数字 15-16 位,float 精度低,有效数字 6-7位,但是 double 消耗的内存是 float 的两倍,运算速度比 float 慢得多,建议能用 float 保证精度的就用 float,少用 double。
- #include <iostream>
- #include <iomanip>
- using namespace std;
-
- int main()
- {
- float a=12.257902012398877;
- double b=12.257902012398877;
- const float PI=3.1415926; // 常量定义
- cout<<setprecision(15)<<a<<endl; // 只有6-7位有效数字,后面的就不精确
- cout<<setprecision(15)<<b<<endl; // 有15-16位有效数字,所以完全正确
- cout<<setprecision(15)<<PI<<endl;
- return 0;
- }
关于 double 类型与 float 类型:
printf() 只会看到双精度数,printf 的 %f 格式总是得到 double,所以在 printf() 中使用 %f 跟 %lf 的输出显示效果是一样的。但是对于变量来说,double 类型比 float 类型的精度要高。double 精度更高,是指它存储的小数位数更多,但是输出默认都是 6 位小数,如果你想输出更多小数,可以自己控制,比如 %.10lf 就输出 10 位小数。
所以一般情况下 double 类型的占位符可以用 %lf
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。