C++之浮点数

浮点数能够表示带小数部分的数字,如M1油箱的汽油里程数(0.56MPG),它们提供的值范围也更大。如果数字很大,无法表示为 kng 类型,如人体的细菌数(估计超过100兆),则可以使用浮点类型来表示。
使用浮点类型可以表示诸如2.5、3.14159和122442.32这样的数字,即带小数部分的数字。计算机将这样的值分成两部分存储。一部分表示值,另一部分用于对值进行放大或缩小。下面打个比方。对于数字34.1245和34124.5,它们除了小数点的位置不同外,其他都是相同的。可以把第一个数表示为0.341245(基准值)和100(缩放因子),而将第二个数表示为0.341245(基准值相同)和10000(缩放因子更大)。缩放因子的作用是移动小数点的位置,术语浮点因此而得名。C++内部表示浮点数的方法与此相同,只不过它基于的是二进制数,因此缩放因子是2的幂,不是10的幂。幸运的是,程序员不必详细了解内部表示。重要的是,浮点数能够表示小数值、非常大和非常小的值,它们的内部表示方法与整数有天填之别。

如何书写浮点数?

C++有两种书写浮点数的方式。

第一种是使用常用的标准小数点表示法:

// floating-point
12.34
// floating-point
939001.32
// floating-point
0.00023
// still floating-point
8.0

即使小数部分为0(如8.0),小数点也将确保该数字以浮点格式(而不是整数格式)表示。(C++标准允许实现表示不同的区域;例如,提供了使用欧洲方法的机制,即将逗号而不是句点用作小数点。然而,这些选项控制的是数字在输入和输出中的外观,而不是数字在代码中的外观。)

第二种表示浮点值的方法叫做E表示法,其外观是像这样的:3.45E6,这指的是3.45与100000相乘的结果;E6指的是10的6次方,即1后面6个0。因此,3.45E6表示的是3450000,6被称为指数,3.45 被称为尾数。下面是一些例子:

// can use E or e, + is optional
2.52e+8
// exponent can be negative
8.33E-4
// same as 7.0E+05
7E5
// can have + or - sign in front
-18.32e13
// 2010 Brazilian public debt in reais
1.69e12
// mass of earth in kilograms
5.98E24
// mass of an electron in kilograms
9.1le-31

读者可能注意到了,E表示法最适合于非常大和非常小的数。
E 表示法确保数字以浮点格式存储,即使没有小数点。注意,既可以使用E也可以使用e,指数可以是正数也可以是负数。然而,数字中不能有空格,因此7.2 E6是非法的。


指数为负数意味着除以10的乘方,而不是乘以10的乘方。因此,8.33E~4表示8.33/10²,即0.000833。同样,电子质量9.1le~31 kg表示 0.000000000000000000000000000911 kg。注意,-8.33E4指的是-83300。前面的符号用于数值,而指数的符号用于缩放。

记住:d.dddE+n指的是将小数点向右移n位,而d.dddE~n指的是将小数点向左移n位。之所以称为“浮点”,就是因为小数点可移动。

浮点数的优缺点 

与整数相比,浮点数有两大优点。首先,它们可以表示整数之间的值。其次,由于有缩放因子,它们可以表示的范围大得多。另一方面,浮点运算的速度通常比整数运算慢,且精度将降低。

例如下面程序:

#include <iostream>
int main(){
using namespace std;
float a=2.34E+22f;
float b= a+1.0f;
cout << "a= "<< a << endl;
cout << "b-a="<< b-a << endl;
return 0;
}

该程序将数字加1,然后减去原来的数字。结果应该为1。下面是在某个系统上运行时该程序的输出:

a=2.34e+022

b-a=0
问题在于,2.34E+22是一个小数点左边有23位的数字。加上1,就是在第23位加1。但float类型只能表示数字中的前.6位或前7位,因此修改第23位对这个值不会有任何影响。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙雨敲代码ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值