理解浮点类型float和double

c和c++对有效数位的要求是,float至少32位,double至少48位且不少于float,long double至少和double一样多(这里指的是二进制数)。通常来说,float为32位,double为64位,long double为80、96、128位。大多数情况下,编译器为float分配4字节,double则分配8字节。

float32位组成:最高位的1位为符号位,接着指数位共8位,指数范围-127~+128(补码形式),然后尾数位共23位。那为什么float型计算机的显示结果只显示6位有效数字呢?那是因为,计算机内部以二进制法存储数据,尾数23即共2^23个有效数字,那么转化成十进制就是log10(2^23)=6.92,即6~7位有效数字,计算机保证至少6位有效数字的精度。同理,64位数的double1位符号位,11位指数位,指数范围为-1023~+1024,52位尾数,有效数字为15~16,保证有效数字为15位精度。

但是,我们会发现,无论用float还是double,我们用cout输出值最多显示6位有效数字。那是因为c++cout默认输出的精度是6位(四舍五入),如果想显示多于6位的精度,那么可以输入头文件#include <iomanip>,然后在输出语句之前插入cout << setprecision(x),x是要显示的精度。假如要显示的精度超出原来数字的实际精度,那么就会有超出部分的误差,例如

float a=2.12351f;
    cout << setprecision(10) << a << endl;//输出结果 2.123509884 


又如

float a = 2.34E+22f;
float b = a + 1.0f;

cout << "a = " << a << endl;
cout << "b - a = " << b - a << endl; //该程序将数字加1,然后减去原来的数字,结果应为1.但是程序的输出结果却是 
a = 2.34e+022
b - a = 0
问题在于,2.34e+022是一个小数点左边有23位的数字。加上1,就是在第23位加1。但float类型只能表示数字中的前6位或前7位,因此修改第23位对这个值不会有任何影响。


另外,程序进行运算时,低精度的会自动向高精度转换,比如有double时,int和float都会转换成double。double消耗的内存是float的两倍,运算速度比float慢得多,建议能保证精度的情况下使用float。

常量后面加F表示是float型,不加F的,整数默认为int型,浮点数默认为double型。这就是我们定义float变量时为什么常在数字添加上f的原因。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值