C++数据类型的属性与限制
2012/6/13 11:40:00 请友读忠(更多) E界MRP开发下载网 241阅 在C++中,每一种内置的数据类型都拥有不同的属性,其中包含的信息对设计程序来说是非常重要的,下面来看一下,库是怎样有助于访问这些信息的。C++中约有10种截然不同的整数类型及超过3种的浮点类型,而每种数据类型都有不同的数值属性,如数值范围、能表示的最大位数、或各自的精度等等,这些属性对金融、科学、图形、数字信号处理等程序来说是极其重要的。本文讨论使用库,怎样在程序中获得这些基本数据类型的数值属性。
\“一个double类型中能存储多少位?\“,\“signed long能表示的最大正数是多少?\“如果这些问题的答案对你的程序很重要,那么你怎样以一种方便、且系统的方法来得到答案呢?答案就是:使用标准库。
浮点的乐章
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
include
using namespace std;
cout ::epsilon( ) ::epsilon())
{
do_equal();
}
如果double类型的(d1*10)-(20.0/d2)结果不大于小正数,那么它几乎为零,因此,两个子表达式结果相等,应用此技巧可有效降低错误的阀值。例如,如果十亿分之一或者更小的数值,对你的程序来说无关紧要,那么可试下以下的技巧:
const double BILLIONTH=1./1000000000;
if ( ((d1*10)-(20.0/d2)) ::digits10::digits10::digits10::max()
在IEC 559规范实现中,浮点数据类型可表示为\“不是一个数字\“或NaN。NaN是一种特殊的编码,其代表某种非法数字,可由非法指令产生,或意为指示一个不应被忽略的数值。如果出现在表达式中的NaN没有发出一个\“信号\“,则其为\“安静\“状态;否则,其为一个发\“信号\“的NaN。下面的例子检查在目标平台上支持哪种NaN类型,并把NaN的值赋给一个变量:
double d=0;
if(numeric_limits::has_quiet_NaN)
d=numeric_limits::quiet_NaN();
else if (numeric_limits::has_signaling_NaN)
d=numeric_limits::signaling_NaN();
else cerr::has_infinity)
f=numeric_limits::infinity();
else cerr<<\“infinity for float isn\‘t supported\“;
发表评论