一 定點整數(shù)與定點小數(shù) 定點數(shù)表示小數(shù)點位置固定的數(shù),當小數(shù)點放置在最尾部時表示定點整數(shù),,當小數(shù)點放在在符號位右邊時位定點小數(shù),。 二進制 0111. 表示定點整數(shù),其十進制值為 ,; 二進制 1111. 表示定點整數(shù),,其十進制值為 ; 二進制 0.111 表示定點小數(shù),,其十進制值為 ,; 二進制 1.111 表示定點小數(shù),其十進制值為 ,; 以上使用原碼表示定點數(shù),,在計算機系統(tǒng)中,使用補碼表示定點數(shù),,這樣將減法運算轉(zhuǎn)換為加法運算,,具體如下: 原碼 0111. 的補碼仍然為 0111.,原碼 1111. 的補碼為 10000. - 0111. = 1001.,; 如求十進制數(shù) -7 的補碼表示,,其步驟如下: 1)求對應(yīng)正數(shù)的補碼表示為 0111; 2)對 0111 取反得 1000,; 3)對 1000 加 1 得到 -7 的補碼表示為 1000 + 1 = 1001,; 應(yīng)用以上規(guī)則,可以推導(dǎo)出 7 的補碼,,其結(jié)果與正數(shù)補碼定義保持一致,,如下: 1)對 -7 的補碼 1001 取反得 0110,; 2)對 0110 加 1 得 0111,結(jié)果與正數(shù)補碼定義保持一致,; 針對定點小數(shù),,其補碼求解方式與定點整數(shù)一致,如下: 1)原碼1.111 其補碼為:0.111 取反得 1.000 加 1 得 1.001,; 2)1.001 取反得 0.110 加 1 得 0.111,,結(jié)果與正數(shù)補碼保持一致; 當對定點數(shù)(定點整數(shù)或定點小數(shù))進行加法運算時,,如果兩個運算數(shù)符號不一致(最高位符號),,其運算結(jié)果不會溢出;如果兩個運算數(shù)符號一致,,當運算結(jié)果符號發(fā)生改變,,則溢出??梢酝ㄟ^比較運算前后符號變化來判斷是否溢出,,示例如下: 7 + 7 = 0111 + 0111 = 1110,最高位符號發(fā)生改變,,則溢出,。 一個更方便得方法是使用兩位符號判斷是否溢出,當兩位符號不同時,,表示溢出,;當兩位符號相同時,表示無溢出,。
二 浮點數(shù)表示 浮點數(shù)使用科學(xué)計數(shù)法,,將特定長度得連續(xù)字節(jié)(32位 或者 64位)分割成不同區(qū)域,分別表示符號,,指數(shù),,尾數(shù)三個部分,具體如下: 單精度(float) 符號位(1位)+ 指數(shù)(8位)+ 尾數(shù)(23位) 雙精度 (double) 符號位(1位)+ 指數(shù)(11位)+ 尾數(shù)(52位) 1)符號位使用 0 表示數(shù)據(jù)為正,,使用 1 表示數(shù)據(jù)為負,; 2)尾數(shù)一般情況下取值范圍為 [1.0, 2),,由于整數(shù)部分始終為 1 ,,故省略掉; 3)指數(shù)部分取值范圍為 [-126, 127](針對單精度),,使用偏置量表示負數(shù),,如指數(shù) -1 表示為 -1 + 127 = 126; 下面使用單精度浮點表示 -158.4: 1)正整數(shù)部分 158 表示為二進制 1001 1110,; 2)小數(shù)部分 .4 可表示為 0110 0110 0110 0110...,,方法如下: .4 * 2 = .8 0 .8 * 2 = 1.6 1 .6 * 2 = 1.2 1 .2 * 2 = .4 0 .4 * 2 = .8 0 ... ... 3)連接正整數(shù)部分與小數(shù)部分得 1001 1110. 0110 0110 0110 0110...,; 4)規(guī)格化尾數(shù)得 1.001 1110 0110 0110 0110 0110...,其指數(shù)為 0111(十進制數(shù) 7),; 5)對指數(shù)使用偏置得 127 + 7 = 0111 1111 + 0111 = 1000 0110,; 7)整合符號位,規(guī)格化尾數(shù),,偏置后指數(shù)得到單精度浮點表示為:1,,1000 0110,001 1110 0110 0110 0110 0110,; 將單精度浮點數(shù) 1,,1000 0110,001 1110 0110 0110 0110 0110 轉(zhuǎn)換為10進制得 -158.39990234375,,這是浮點運算中誤差來源之一,。通過使用雙精度浮點,可以減小表示誤差,,但同樣無法消除表示誤差,。計算機表示得浮點數(shù)實際上是整個實數(shù)集得一個有限子集,雙精度只是比單精度能夠表示得浮點數(shù)更加多一些而已,。
三 浮點數(shù)誤差 浮點數(shù)誤差來源包括: 1)浮點表示時與真實值之間存在誤差,,雙精度浮點誤差小于單精度浮點; 2)浮點數(shù)計算時,,小階浮點需要與大階浮點對階,,右移小階尾數(shù)可能產(chǎn)生舍入誤差; 在程序中,,應(yīng)該避免浮點數(shù)誤差所產(chǎn)生得負面影響,。一般策略包括: 1)控制兩相加數(shù)得階差,避免舍入誤差,; 2)必要時使用雙精度浮點以減少表示誤差,; 3)避免雙精度浮點轉(zhuǎn)換到單精度浮點所產(chǎn)生的表示誤差;
在 float.h 中定義了 #define FLT_EPSILON 1.192092896e-07F // smallest such that 1.0+FLT_EPSILON != 1.0 #define DBL_EPSILON 2.2204460492503131e-016 // smallest such that 1.0+DBL_EPSILON != 1.0 當某個浮點數(shù)小于 FLT_EPSILON 或者 DBL_EPSILON 時,,該浮點數(shù)無法對相加結(jié)果產(chǎn)生影響,,因此,可以使用該方法來判斷浮點相等,,如: if(fabs(num - .1) < FLT_EPSILON) 表示浮點變量 num 與 .1 相等,; 當然,由于任意實數(shù)被最終轉(zhuǎn)換為一個計算機可表示的浮點值,,對于相同轉(zhuǎn)換規(guī)則,,直接使用 == 判斷浮點相等是可行的;在不同硬件體系結(jié)構(gòu)中,,是否存在差異,,可能需要進一步討論,。
|
|
來自: 昵稱70747151 > 《待分類》