浮点数
来源:互联网 发布:域名绑定邮箱服务器 编辑:程序博客网 时间:2024/04/29 13:20
浮点数科学记号表示法
任何一个浮点数 M*10^X, 在程序中,可以表示为 MeX,或MEX(其中,M为有效数字,X为以10为基数的指数部分,e代表指数指定的英文字母)
浮点数类型
浮点数包括 float, double, long double 三种类型。 long double 在不同编译器上,存储范围不同,因此在考虑移植时谨慎使用
浮点数的声明
浮点数的预设类型为double,在指定float浮点数数时,子数值末尾加f或F,在指定long double时,字尾加l或L。
不同类型的比较
float 存储较小的实数,存储空间为4字节,存储值范围为+-2.4E10+-38,有效精度位数为7;
double存储空间为8字节,存储值范围为+-1.7E10+-308,有效数字位数为15;
long double 存储空间为12字节,存储值范围+-1.1E10+-4932,有效精度位数为18。
浮点数的存储值
浮点数在程序中的存储值,有可能只是接近指定值,但和指定值之间有一点微小的差距,差距可能是多一些,也可能是少一些。
浮点数的比较
因为浮点数的存储值和指定值之间有微小的差距,因此,在比较两个浮点数是否相等的时候,不能直接用等号,而是判断它们之间的差距是否在可控制范围之内。
上面的问题,我们可以看一个例子,判断一个浮点数,如果值为1e42,则输出1,否则0;
#include<iostream>using namespace std;int main(void){ float f=1e42f; if(f==1e42) { cout<< 1<<endl; } else { cout<<0<<endl; } return 0;}结果是什么,当我们输入1e42时,程序的返回值为0。这说明在存储时,真实存储值不为1e42。现在我们把程序改为
#include <iostream>#include "math.h"using namespace std;int main(void){ float f=1e36f; if(fabs(f-1e36)<1e30) { cout<<1<<endl;; } else { cout<<0<<endl; } return 0;}最后输出结果为1。这就提醒我们,在做浮点数比较时,一定不能直接通过比较符比较,要做差之后来判断是否相等。