浮點(diǎn)運(yùn)算-精讀丟失的原因和解決辦法:

首先我們要搞清楚下面兩個(gè)問題:

(1) 十進(jìn)制整數(shù)如何轉(zhuǎn)化為二進(jìn)制數(shù)

算法很簡(jiǎn)單。舉個(gè)例子,11表示成二進(jìn)制數(shù):

11/2=5  余   1
5/2=2   余   1
2/2=1   余   0
1/2=0   余   1
0結(jié)束         

11二進(jìn)制表示為(從下往上):1011

這里提一點(diǎn):只要遇到除以后的結(jié)果為0了就結(jié)束了,大家想一想,所有的整數(shù)除以2是不是一定能夠最終得到0。換句話說,所有的整數(shù)轉(zhuǎn)變?yōu)槎M(jìn)制數(shù)的算法會(huì)不會(huì)無限循環(huán)下去呢?絕對(duì)不會(huì),整數(shù)永遠(yuǎn)可以用二進(jìn)制精確表示 ,但小數(shù)就不一定了。

(2) 十進(jìn)制小數(shù)如何轉(zhuǎn)化為二進(jìn)制數(shù)
算法是乘以2直到?jīng)]有了小數(shù)為止。舉個(gè)例子,0.9表示成二進(jìn)制數(shù)
0.9*2=1.8   取整數(shù)部分 1
0.8(1.8的小數(shù)部分)*2=1.6    取整數(shù)部分 1
0.6*2=1.2   取整數(shù)部分 1
0.2*2=0.4   取整數(shù)部分 0
0.4*2=0.8   取整數(shù)部分 0
0.8*2=1.6   取整數(shù)部分 1
0.6*2=1.2   取整數(shù)部分 0
.........      

0.9二進(jìn)制表示為(從上往下): 1100100100100......

注意:上面的計(jì)算過程循環(huán)了,也就是說*2永遠(yuǎn)不可能消滅小數(shù)部分,這樣算法將無限下去。很顯然,小數(shù)的二進(jìn)制表示有時(shí)是不可能精確的 。其實(shí)道理很簡(jiǎn)單,十進(jìn)制系統(tǒng)中能不能準(zhǔn)確表示出1/3呢?同樣二進(jìn)制系統(tǒng)也無法準(zhǔn)確表示1/10。這也就解釋了為什么浮點(diǎn)型減法出現(xiàn)了"減不盡"的精度丟失問題。

references:

https://blog.csdn.net/tomcat_2014/article/details/51453988
http://www.itdecent.cn/p/9f46c523d5ab

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容