<b>C++数据范例的属性与限制</b>[VC/C++编程]
本文“<b>C++数据范例的属性与限制</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在C++中,每一种内置的数据范例都拥有差别的属性,此中包含的信息对计划程序来说是非常重要的,下面来看一下,<limits>库是怎样有助于拜候这些信息的.
C++中约有10种截然差别的整数范例及超越3种的浮点范例,而每种数据范例都有差别的数值属性,如数值范围、能表示的最大位数、或各自的精度等等,这些属性对金融、科学、图形、数字信号处理等程序来说是极端重要的.本文谈论利用<limits>库,怎样在程序中得到这些基本数据范例的数值属性.
"一个double范例中能存储多少位?","signed long能表示的最大正数是多少?"假如这些问题的答案对你的程序很重要,那么你怎样以一种便利、且系统的办法来得到答案呢?答案就是:利用尺度<limits>库.
浮点的乐章
C++中浮点数据范例精度是有限的,某些与硬件有关的特点招致了浮点数据范例的截断与取整.目前,你就懂得为什么2.0/3.0的后果大约是0.66666666666666663了吧,"数字噪音"普通是大大都bug的源头,请看以下例子:
double d1=2., d2=3.;
d1/=d2; // 2/3
if (d1*10==(20./d2)) //条件本应当是"真"的,但,哎!
{
//永久不大概履行到的代码
do_equal();
}
花括号中的代码行永久也不大概履行,因为在 == 两边的表达式后果会有轻细的差别,d1*10的后果是6.6666666666666661,而20./d2的后果是6.6666666666666670,恰是这种浮点算法的截断与近似值招致了此差别的发生.在此,可以利用定标整数,但有时这并非一个妥善的办理办法,试想有一张计算复数公式的电子表格--它必须利用浮点范例,在这种情形下,小正数(epsilon)常量这个问题就来了,小正数普通为可用给定数据范例的大于1的最小值与1之差来表示.举例来说,double范例的小正数为:
#include <iostream>
#include <limits>
using namespace std;
cout << numeric_limits<double>::epsilon( ) << endl; //输出:2.22045e-016
为削减if语句中数字噪音带来的影响,可用一个查抄两值大概相等的表达式来替换 == 操作符.如:
if ( ((d1*10)-(20.0/d2)) <= numeric_limits<double>::epsilon())
{
do_equal();
}
假如double范例的(d1*10)-(20.0/d2)后果不大于小正数,那么它几近为零,因此,两个子表达式后果相等,利用此本领可有效降低错误的阀值.比方,假如十亿分之一大概更小的数值,对你的程序来说无关紧急,那么可试下以下的本领:
const double BILLIONTH=1./1000000000;
if ( ((d1*10)-(20.0/d2)) <= BILLIONTH)
此处请记着,小正数是最小的毛病极限.
比double更好
挑选一种浮点数据范例的尺度,是它可以在精度无损的情形下最大存储的十进制位数.比方,假定你的程序必须支持到16位的十进制数,那么应当利用double、long double还是用户自定义范例呢?要解答此问题,可以利用numeric_limits::digits10常量,它会奉告你在精度无损情形下某种范例可表示的最大十进制位数:
cout<<numeric_limits<double>::digits10<<endl;//输出:15
看起来double并不支持这种精度,那么long double呢?
cout<<numeric_limits<long double>::digits10<<endl; //输出:18
对了,它便可以.请注意,digits10对整型数也一样实用:
cout<<numeric_limits<long>::digits10<<endl; //输出:9
最大值与最小值
最大值与最小值便是对呼应范例调用numeric_limits::max()和numeric_limits:min()所得到的值:
cout<<numeric_limits<int>::max()<<endl;// 2147483647
无限的<limits>
在IEC 559标准实现中,浮点数据范例可表示为"不是一个数字"或NaN.NaN是一种特别的编码,其代表某种不法数字,可由不法指令产生,或意为指导一个不该被忽视的数值.假如呈目前表达式中的NaN没有发出一个"信号",则其为"安静"状况;不然,其为一个发"信号"的NaN.下面的例子查抄在目标平台上支持哪类NaN范例,并把NaN的值赋给一个变量:
double d=0;
if(numeric_limits<double>::has_quiet_NaN)
d=numeric_limits<double>::quiet_NaN();
else if (numeric_limits<double>::has_signaling_NaN)
d=numeric_limits<double>::signaling_NaN();
else cerr<<"NaN for double isn't supported";
无限在此是一种特别的情形,其普通由被零除或其他操作产生.下例代码查抄目标平台上能否定义了一种特别的无限码,并把此值赋给一个变量:
float f=0;
if(numeric_limits<float>::has_infinity)
f=numeric_limits<float>::infinity();
else cerr<<"infinity for float isn't supported";
以上是“<b>C++数据范例的属性与限制</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |