亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

PHP浮點(diǎn)運(yùn)算結(jié)果出現(xiàn)誤差原因分析及解決方案

系統(tǒng) 2126 0

如下:

      float a = 0.65f;
float b = 0.6f;
float c = a - b;
    

?

此時(shí)c為多少?

?

0.05?錯(cuò)誤!

?

此時(shí)c為0.0499999523!

?

為什么?

?

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

?

?

下面我們來(lái)分析下:

?

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

?

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

?

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

?

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

?

例如:將十進(jìn)制數(shù)值25.75轉(zhuǎn)換為二進(jì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.65及0.6轉(zhuǎn)換為二進(jìn)制代碼:

?

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

?

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

?

?

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

?

文章開(kāi)始部分,我們用的float類(lèi)型,下面我們來(lái)看看float類(lèi)型是否能存儲(chǔ)上面轉(zhuǎn)換出的二進(jìn)制代碼。

?

目前計(jì)算機(jī)上存儲(chǔ)浮點(diǎn)數(shù)值是按照IEEE(電氣和電子工程師協(xié)會(huì))754浮點(diǎn)存儲(chǔ)格式標(biāo)準(zhǔn)來(lái)存儲(chǔ)的。

?

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

?

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

?

截取的二進(jìn)制代碼已無(wú)法正確表示0.65及0.5,根據(jù)這個(gè)二進(jìn)制代碼肯定無(wú)法正確得到結(jié)果0.05。

?

?

?

如何解決這個(gè)問(wèn)題?知道其根本原因后,我們知道是無(wú)法從根本上解決這個(gè)問(wèn)題的,但我們可以有一些曲線(xiàn)救國(guó)的方法,下面列舉幾個(gè):

?

1. 因?yàn)槎M(jìn)制數(shù)值可以準(zhǔn)確表示整數(shù)(可以使用整數(shù)轉(zhuǎn)換為二進(jìn)制方法驗(yàn)證下),所以可以將小數(shù)乘以10或100等變成整數(shù),然后做運(yùn)算,最后再通過(guò)除以10或100等獲得結(jié)果;

?

2. 通過(guò)截取結(jié)果的有效小數(shù)位數(shù)等,來(lái)取得最好的近似結(jié)果,然后在做處理。

?

3. 對(duì)于可以用有限長(zhǎng)度的二進(jìn)制數(shù)值表示的十進(jìn)制數(shù)值,可以使用存儲(chǔ)位數(shù)大于其長(zhǎng)度的數(shù)據(jù)類(lèi)型。

?

解決方案正在補(bǔ)充中……,若各位有什么好的方法也可以提出來(lái)!

?

以上解決方案需要按照使用的實(shí)際情況來(lái)決定使用哪種方法。

?

來(lái)源: http://www.2cto.com/kf/201007/52889.html

?

?

PHP浮點(diǎn)運(yùn)算結(jié)果出現(xiàn)誤差原因分析及解決方案


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 天天碰天天摸天天操 | 国产福利一区视频 | 亚洲精品美女在线观看 | 中国毛片免费看 | 精品国产一区二区三区四区色 | 精品国产一区二区三区香蕉事 | 欧美成人在线观看 | 成年人性生活免费视频 | 男人的天堂一区二区视频在线观看 | 男女一级毛片免费视频看 | 日本高清中文字幕一区二区三区 | 久久草在线播放 | 99久久精品免费看国产 | 一区二区三区高清在线 | 精品欧美一区手机在线观看 | 欧美一区二区三区国产精品 | 日韩精品一区二区三区在线观看 | 国内精品伊人久久久久7777人 | 香蕉在线视频网站 | 欧美日韩国产人成在线观看 | 毛片在线播放a | 奇米影视7777久久精品 | 97影院支持微信微博观看 | 四虎永久免费地址 | 国产精品在线 | 中文字幕欧美在线观看 | 婷婷四房综合激情五月性色 | 91成人啪国产啪永久地址 | 欧美亚洲国产色综合 | 日韩国产综合 | 伊人久久99亚洲精品久久频 | 国产一级久久久久久毛片 | 国产成人无精品久久久久国语 | 伊人久久精品亚洲午夜 | 毛片网站大全 | 国产成人精品高清不卡在线 | 中文字幕在线一区二区三区 | 国产精品麻豆一区二区 | 深夜在线免费视频 | 老师在办公室被躁到白浆 | 国产日韩精品欧美一区色 |