C++中float,double到底保留几位有效数字

intival=3;floatfval=1.32121212f;doubledval=-45.67456554;doubledval2=-4.45651111111111... 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

疑问:为什么运行结果是double和float都显示6位有效数字,我记得double有十多位的啊。。
展开
 我来答
怒TV
推荐于2019-08-23 · TA获得超过1万个赞
知道答主
回答量:30
采纳率:100%
帮助的人:4596
展开全部

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位。

百度网友44496f5
推荐于2019-08-11
知道答主
回答量:10
采纳率:0%
帮助的人:1391
展开全部

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位



本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
花谢应当相怜
推荐于2019-09-28 · TA获得超过6899个赞
知道答主
回答量:39
采纳率:50%
帮助的人:5698
展开全部

float精度是2^23,能保证6位。
double精度是2^52,能保证15位。
但是默认float和double都只能显示6位。

扩展资料

C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。 

C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
冰冻了你呢
推荐于2019-08-14 · TA获得超过1.2万个赞
知道答主
回答量:99
采纳率:0%
帮助的人:4.9万
展开全部

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位。这应该就是他们的的最基本的区别吧。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yuantailing
推荐于2017-09-27 · TA获得超过2545个赞
知道小有建树答主
回答量:1167
采纳率:92%
帮助的人:660万
展开全部
float精度是2^23,能保证6位。
double精度是2^52,能保证15位。
double精度的确有那么高,但是默认打印位数没有那么多。
先#include <iomanip>,然后在输出语句之前插入cout << setprecision(20);强行要求输出20位精度,就可以比较出float和double的精度差别了。
更多追问追答
追问
然后结果变成了:

3
1.3212121725082397
-45.674565540000003
-4.4565111111111113
额,怎么float和double都有17位了,后面那些拓展的怎么都不是我设置的大小啊
追答
这就是超出精度部分的误差。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式