C 資料型別的屬性與限制

2021-04-16 08:36:57 字數 2626 閱讀 9127

c++資料型別的屬性與限制

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)) //條件本應該是「真」的,但,哎!

花括號中的**行永遠也不可能執行,因為在 == 兩邊的表示式結果會有輕微的差別,d1*10的結果是6.6666666666666661,而20./d2的結果是6.6666666666666670,正是這種浮點演算法的截斷與近似值導致了此差異的發生。在此,可使用定標整數,但有時這並不是乙個妥善的解決辦法,試想有一張計算複數公式的電子**——它必須使用浮點型別,在這種情況下,小正數(epsilon)常量這個問題就來了,小正數通常為可用給定資料型別的大於1的最小值與1之差來表示。舉例來說,double型別的小正數為:

#include

#include

using namespace std;

cout << numeric_limits::epsilon( ) << endl; //輸出:2.22045e-016

為減少if語句中數字噪音帶來的影響,可用乙個檢查兩值粗略相等的表示式來代替 == 操作符。如:

if ( ((d1*10)-(20.0/d2)) <= numeric_limits::epsilon())

如果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<::digits10<

看起來double並不支援這種精度,那麼long double呢?

cout<::digits10<

對了,它就可以。請注意,digits10對整型數也同樣適用:

cout<::digits10<

最大值與最小值

最大值與最小值即是對相應型別呼叫numeric_limits::max()和numeric_limits:min()所得到的值:

cout<::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<<"nan for double isn't supported";

無限在此是一種特殊的情況,其通常由被零除或其他操作產生。下例**檢查目標平台上是否定義了一種特殊的無限碼,並把此值賦給乙個變數:

float f=0;

if(numeric_limits::has_infinity)

f=numeric_limits::infinity();

else cerr<<"infinity for float isn't supported";

MySQL 資料型別 資料型別的屬性

資料表在建立時,需為每個字段選擇資料型別,而資料型別的選擇則決定著資料的儲存格式,有效範圍和相應的限制。mysql 提供了多種資料型別,主要分為 3 類 1 整型 mysql資料型別 含義 有符號 tinyint m 1個位元組 範圍 128 127 smallint m 2個位元組 範圍 3276...

mysql資料型別屬性 MySQL資料型別和屬性

mysql資料型別和屬性 2010 10 19 11 54 48 標籤 mysql 資料型別 雜談資料型別和屬性 對mysql表每個列中的資料實行嚴格的控制,這是資料驅動應用程式成功的關鍵。這些資料型別的行為可以通過包含屬性 attribute 進一步調整。資料型別分為三種類別 日期和時間 數值以及...

SQL SERVER資料型別與C 資料型別對照表

sql server型別 c 型別 精確數字 bigint 從 2 63 9223372036854775808 到 2 63 1 9223372036854775807 的整型資料 所有數字 儲存大小為 8 個位元組。int64 int從 2 31 2,147,483,648 到 2 31 1 2...