浮点数

来源:互联网 发布:域名绑定邮箱服务器 编辑:程序博客网 时间: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。这就提醒我们,在做浮点数比较时,一定不能直接通过比较符比较,要做差之后来判断是否相等。