C++中float,double到底保留几位有效数字
float fval = 1.32121212f;
double dval = -45.67456554;
double dval2 = -4.456511111111111;
cout << ival << endl;
cout << fval << endl;
cout << dval << endl;
cout << dval2 << endl;
输出的结果是:
3
1.32121
-45.6746
-4.45651
疑问:为什么运行结果是double和float都显示6位有效数字,我记得double有十多位的啊。。 展开
float精度是2^23,能保证6位。double精度是2^52,能保证15位。但是默认float和double都只能显示6位,再多需要#include <iomanip>,然后在输出语句之前插入cout << setprecision(20);强制输出小数位。
拓展资料
float与double的范围和精度
1、范围
float和double的范围是由指数的位数来决定的。
float的指数位有8位,而double的指数位有11位,分布如下:
float:1bit(符号位) 8bits(指数位) 23bits(尾数位)
double:1bit(符号位) 11bits(指数位) 52bits(尾数位)
于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
2、精度
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
float精度是2^23,能保证6位。
double精度是2^52,能保证15位。
但是默认float和double都只能显示6位,再多需要#include ,然后在输出语句之前插入cout << setprecision(20);强制输出小数位。
float fval = 1.32121212f;
double dval = -45.67456554;
double dval2 = -4.456511111111111;
cout << fval << endl;
cout << dval << endl;
cout << dval2 << endl;
输出的结果是:
1.32121
-45.6746
-4.45651
扩展资料
结论:
有些编译器 float的有效数字位是 8位 , 有些有效数字位是 7位
有些编译器double的有效数字位是 15位, 有些是 16位
注意printf(“%f”, x); // 默认输出6位小数(不要和有效数字混淆)
C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算
是float还是double,在内存中的存储主要分成三部分,分别是:
(1)符号位(Sign): 0代表正数,1代表负数
(2)指数位(Exponent): 用于存储科学计数法中的指数部分,并且采用移位存储方式
(3)尾数位(Mantissa): 用于存储尾数部分float 是 32位, 其中有23位用于存放尾数, 带有一个固定隐含位.. 所以float的有24个二进制有效位位数.
2^24共有8个十进制位. 所以有些编译器 float的有效数字位是 8位 , 有些有效数字位是 7位.(注意不是小数的位数, 是有效数字位)
double也一样,是64位, 其中有52位用于存放尾数, 一个固定隐含位. 共有 53个二进制有效位位数.
2^53次方有15个十进制位, 所以有些编译器double的有效数字位是15位, 有些是16位
分析
int ival = 3;
float fval = 1.32121212f;
double dval = -45.67456554;
double dval2 = -4.456511111111111;
cout << ival << endl;
cout << fval << endl;
cout << dval << endl;
cout << dval2 << endl;
输出的结果是:
3
1.32121
-45.6746
-4.45651
【拓展资料】
C语言中float和double的区别
float为单精度,占4字节(32位)的内存空间,它的数值有效范围是-10的38次方到10的38次方,只表示7位有效数字。而double为双精度,8字节,正负10的308次方之间,能精确到16位。这应该就是他们的的最基本的区别吧。
double精度是2^52,能保证15位。
double精度的确有那么高,但是默认打印位数没有那么多。
先#include <iomanip>,然后在输出语句之前插入cout << setprecision(20);强行要求输出20位精度,就可以比较出float和double的精度差别了。
然后结果变成了:
3
1.3212121725082397
-45.674565540000003
-4.4565111111111113
额,怎么float和double都有17位了,后面那些拓展的怎么都不是我设置的大小啊
这就是超出精度部分的误差。