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";

时间: 2025-01-26 19:36:39

C++数据类型的属性与限制的相关文章

给category添加基本数据类型属性

给category添加基本数据类型属性     说明 通常,我们添加属性都是通过对象扩展来实现的,其实,我们也可以用runtime来添加基本数据类型的属性   源码 // // UIView+AnimationProperty.h // RuntimeCategory // // Created by YouXianMing on 15/7/8. // Copyright (c) 2015年 YouXianMing. All rights reserved. // #import <UIKit/

JS魔法堂:属性、特性,傻傻分不清楚

或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById("dummy"); el.hello = "test"; console.log(el.getAttribute("hello")); // IE67下输出test,其他浏览器输出null   "搞毛啊?",苦逼的Jser对着浏览器大呼一声.然后就用下面蹩脚的方式草草处理掉了. function getAttr(el, p

Java的简单数据类型

数据类型 数据类型就是对内存位置的抽象表达.程序员可以利用多种数据类型:某些由编程语 言定义,某些由外部库定义,还有些则由程序员来定义.很多编程语言都依赖于特定的计 算机类型和对数据类型属性的具体编译实现,比如word和integer数据类型的大小等.另 一方面,Java的虚拟机负责定义其内置数据类型的各方面内容.这就意味着不管Java虚拟 机(JVM)运行在何等低级的操作系统之上,数据类型的属性都是完全一样的. 简单数据类型 简单数据类型是不能再简化的.内置的数据类型,由编程语言定义,表示真实

深入理解CSS属性值语法

万维网联盟(W3C) 使用了一套特别的语法来定义 CSS 的属性值,能让所有的 CSS 属性都用.如果你曾看过 CSS 规范,你可能已经见过这套语法了.就像 border-image-slice 的语法 ,让我们看看: <'border-image-slice'> = [<number> | <percentage>]{1,4} && fill? 如果你不知道这些符号以及它们如何工作的话,这套语法可能非常难理解.然而,这值得花时间来学.如果你理解 W3C

MySQL数据库学习笔记(二)----MySQL数据类型

[正文] 上一章节中,我们学习了MySQL软件的安装,既然软件都装好了,现在就正式开始MySQL的基础知识的学习吧,即使是零基础,也要一步一个脚印.恩,首先要学习的就是MySQL的数据类型. 一.数据类型: 1.整型(xxxint) 2.浮点型(float和double) 3.定点数(decimal) 4.字符串(char,varchar,xxxtext) 5.二进制数据(xxxBlob) 6.日期时间类型   二.数据类型介绍: 1.整型: 注:M表示最大的显示宽度.其中,int用的最多. 2

oracle数据类型

原文:oracle数据类型     oracle数据类型      有道是,磨刀不误砍柴工.多了解一些底层的东西,对于Oracle开发.维护大有裨益.个人总结了一些Oracle数据类型集解,相信读者阅读了本文以后,Oracle数据库开发起来会事半功倍! 在Oracle数据库中,每个关系表都由许多列组成.给每一列指派特定的数据类型来定义将在这个列中存储得数据类型. 1.CHAR最多可以以固定长度的格式存储2000个字符或字节.默认指定为以字符形式进行存储,这个数据类型是固定长度的,并且当位数不够时

Mysql学习笔记(一)数据类型

原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型     Mysql数据类型             含义(有符号)     tinyint(m) 一个字节 范围(-128~127)     smallint(m) 两个字节 范围(-32768~32767)     mediumint(m) 三个字节 范围(-8388608~8388607)     int(m) 四个字节 范围(-2147483648~2147483647)     bi

mysql数据类型详解

1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节  范围(-128~127) smallint(m) 2个字节  范围(-32768~32767) mediumint(m) 3个字节  范围(-8388608~8388607) int(m) 4个字节  范围(-2147483648~2147483647) bigint(m) 8个字节  范围(+-9.22*10的18次方) 取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为

深入理解C++中变量的存储类别和属性_C 语言

C++变量的存储类别(动态存储.静态存储.自动变量.寄存器变量.外部变量)动态存储方式与静态存储方式 我们已经了解了变量的作用域.作用域是从空间的角度来分析的,分为全局变量和局部变量. 变量还有另一种属性--存储期(storage duration,也称生命期).存储期是指变量在内存中的存在期间.这是从变量值存在的时间角度来分析的.存储期可以分为静态存储期(static storage duration)和动态存储期(dynamic storage duration).这是由变量的静态存储方式和