当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .