一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

C語言浮點數(shù)運算的精度問題

 e3399 2011-06-15

在實際編程中,經(jīng)常會用到浮點運算,大家可能會發(fā)現(xiàn)其結(jié)果出現(xiàn)誤差,與實際期待值不一樣。如下C#代碼:

  float a = 0.65f;

  float b = 0.6f;

  float c = a - b;

  此時c為多少?

  0.05?錯誤!

  此時c0.0499999523

  為什么?

  其根本原因是計算機所使用二進制01代碼無法準確表示某些帶小數(shù)位的十進制數(shù)據(jù)。

  下面我們來分析下:

  我們知道將一個十進制數(shù)值轉(zhuǎn)換為二進制數(shù)值,需要通過下面的計算方法:

  1. 整數(shù)部分:連續(xù)用該整數(shù)除以2,取余數(shù),然后商再除以2,直到商等于0為止。然后把得到的各個余數(shù)按相反的順序排列。簡稱"2取余法"。

  2. 小數(shù)部分:十進制小數(shù)轉(zhuǎn)換為二進制小數(shù),采用"2取整,順序排列"法。用2乘以十進制小數(shù),將得到的整數(shù)部分取出,再用2乘余下的小數(shù)部分,然后再將積的整數(shù)部分取出,如此進行,直到積中的小數(shù)部分為0或者達到所要求的精度為止。然后把取出的整數(shù)部分按順序排列起來,即先取出的整數(shù)部分作為二進制小數(shù)的高位,后取出的整數(shù)部分作為低位有效位。簡稱"2取整法"。

  3. 含有小數(shù)的十進制數(shù)轉(zhuǎn)換成二進制,整數(shù)、小數(shù)部分分別進行轉(zhuǎn)換,然后相加。

  例如:將十進制數(shù)值25.75轉(zhuǎn)換為二進制數(shù)值,步驟如下:

  25(整數(shù)部分)

  25/2=12......1

  12/2=6.......0

  6/2=3......0

  3/2=1......1

  1/2=0......1

  (25) 10=(11001) 2

  0.75(小數(shù)部分)

  0.75*2=1.5......1

  0.5*2=1......1

  (0.75) 10=(0.11) 2

  (25.75) 10=(11001) 2+(0.11) 2=(11001.11) 2

  按照上述方法,我們將0.650.6轉(zhuǎn)換為二進制代碼:

  (0.65)10 = (0.101001100110011001100110011001100110011......)2

  (0.6) 10 = (0.10011001100110011001100110011001100110011......)2

  后面的省略號表示已經(jīng)算不完了,后面在無限重復(fù) 0011 這段二進制數(shù)值。

  文章開始部分,我們用的float類型,下面我們來看看float類型是否能存儲上面轉(zhuǎn)換出的二進制代碼。

  目前計算機上存儲浮點數(shù)值是按照IEEE(電氣和電子工程師協(xié)會)754浮點存儲格式標準來存儲的。

  IEEE單精度浮點格式共32位,包含三個構(gòu)成字段:23位小數(shù)f,8位偏置指數(shù)e,1位符號s。將這些字段連續(xù)存放在一個32位字里,并對其進行編碼。其中0:22位包含23位的小數(shù)f; 23:30位包含8位指數(shù)e;第31位包含符號s。如下圖所示:

編程基礎(chǔ):浮點運算結(jié)果為什么會出現(xiàn)誤差

  也就是說上面將0.650.5轉(zhuǎn)換出的二進制代碼,我們只能存儲23位,即使數(shù)據(jù)類型為double,也只能存儲52位,這樣大家便能看出問題出現(xiàn)的原因了。

  截取的二進制代碼已無法正確表示0.650.5,根據(jù)這個二進制代碼肯定無法正確得到結(jié)果0.05。

 

C語言浮點型變量   小數(shù)點后面有效數(shù)字的位數(shù)

浮點型變量分為單精度(float型)、雙精度(double型)、長雙精度(long double型)3類,單精度浮點型小數(shù)點后面有效數(shù)字為6~7位和雙精度浮點型小數(shù)點后面有效數(shù)字為15~16
如下面這個例子
float a;
scanf("%f", &a);
printf("%f\n", a);
 
輸入:1.123456789
輸出:1.12345684   //小數(shù)點后面6位才是精確值
 

 

**********************************************

原文來源:http://www./data-structure/v493395.html

http://z.baidu.com/question/226808286.html?fr=qrl&cid=203&index=1

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产一级内片内射免费看 | 日韩国产欧美中文字幕| 亚洲一区二区精品久久av| 欧美一区二区三区在线播放| 欧美国产日韩变态另类在线看| 蜜桃臀欧美日韩国产精品| 日本不卡在线视频中文国产| 欧美日韩国产免费看黄片| 清纯少妇被捅到高潮免费观看| 国产视频福利一区二区| 国产日韩在线一二三区| 亚洲成人免费天堂诱惑| 国产不卡最新在线视频| 亚洲最新的黄色录像在线| 91人妻人人揉人人澡人| 激情五月天免费在线观看| 日韩美成人免费在线视频| 亚洲国产精品无遮挡羞羞| 激情五月天深爱丁香婷婷| 国产欧美日产中文一区| 国产av大片一区二区三区| 欧美精品日韩精品一区| 日本大学生精油按摩在线观看| 99视频精品免费视频播放| 亚洲国产成人av毛片国产| 久热久热精品视频在线观看| 极品少妇嫩草视频在线观看| 亚洲淫片一区二区三区| 丰满人妻一二三区av| 97人妻人人揉人人躁人人| 日本午夜一本久久久综合| 欧美一区二区三区十区| 国产又粗又猛又爽又黄| 国产又色又爽又黄又免费| 乱女午夜精品一区二区三区| 黄片三级免费在线观看| 国产精品日韩精品最新| 热情的邻居在线中文字幕| 97人妻精品免费一区二区| 欧美乱视频一区二区三区| 国产不卡视频一区在线|