欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

PHP浮點運算結果出現誤差原因分析及解決方案

系統 2223 0

如下:

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

?

此時c為多少?

?

0.05?錯誤!

?

此時c為0.0499999523!

?

為什么?

?

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

?

?

下面我們來分析下:

?

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

?

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

?

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

?

3. 含有小數的十進制數轉換成二進制,整數、小數部分分別進行轉換,然后相加。

?

例如:將十進制數值25.75轉換為二進制數值,步驟如下:

?

25(整數部分)

?

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(小數部分)

?

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轉換為二進制代碼:

?

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

?

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

?

?

后面的省略號表示已經算不完了,后面在無限重復 0011 這段二進制數值。

?

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

?

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

?

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

?

也就是說上面將0.65及0.5轉換出的二進制代碼,我們只能存儲23位,即使數據類型為double,也只能存儲52位,這樣大家便能看出問題出現的原因了。

?

截取的二進制代碼已無法正確表示0.65及0.5,根據這個二進制代碼肯定無法正確得到結果0.05。

?

?

?

如何解決這個問題?知道其根本原因后,我們知道是無法從根本上解決這個問題的,但我們可以有一些曲線救國的方法,下面列舉幾個:

?

1. 因為二進制數值可以準確表示整數(可以使用整數轉換為二進制方法驗證下),所以可以將小數乘以10或100等變成整數,然后做運算,最后再通過除以10或100等獲得結果;

?

2. 通過截取結果的有效小數位數等,來取得最好的近似結果,然后在做處理。

?

3. 對于可以用有限長度的二進制數值表示的十進制數值,可以使用存儲位數大于其長度的數據類型。

?

解決方案正在補充中……,若各位有什么好的方法也可以提出來!

?

以上解決方案需要按照使用的實際情況來決定使用哪種方法。

?

來源: http://www.2cto.com/kf/201007/52889.html

?

?

PHP浮點運算結果出現誤差原因分析及解決方案


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美大片在线观看 | 亚洲精品国产不卡在线观看 | 午夜社区 | 先锋影音av最新资源 | 高清国产一区二区三区四区五区 | 不卡一二三区 | 精品中文在线 | 一区二区三区在线观看视频 | 亚洲黄色高清视频 | 欧美日韩在线免费观看 | 91中文字幕在线 | 意大利av在线| 欧美二级毛片免费高清电影 | 天天干天天插天天 | 天堂一区二区三区四区 | 日韩一级欧美一级毛片在线 | 国产精品乱码一区二三区小蝌蚪 | 一级a毛片 | 国产小视频在线观看www | 国产毛片欧美毛片久久久 | 亚洲在线资源 | 欧美精品一区二区三区在线播放 | 久操国产视频 | 日本高清视频www | 亚欧洲精品视频在线观看 | www.av在线免费观看 | 99国精产品一区二区三区A片 | 国产 福利 在线 | 欧美乱码伦视频免费 | 精品免费 | 亚洲精品视频观看 | 精品国产黄a∨片高清在线 亚洲3atv精品一区二区三区 | 亚洲欧洲精品成人久久曰影片 | 国产日韩一区二区 | 国产美女高清片免费观看 | 国产aaa毛片| 亚洲成av人片在线观看 | 国产一区二区精品在线观看 | 一级视频在线免费观看 | 中文字幕日韩欧美 | 国外成人免费视频 |