999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

2.55乘100,結果竟不是255!

2015-04-29 23:22:51彌塵
電腦迷 2015年12期
關鍵詞:計算機

彌塵

很久以前,程序員成心文同學遇到了他編程史上的第一個浮點數誤差Bug,這個Bug正如標題所述,在他的程序下2.55*100的結果竟是254.99999999999997,而非255。因為是初次遇到,所以他也不知道是怎么回事,但在請教中外倆.NET大牛無果后,他果斷拍板決定“自己動手,豐衣足食”。

后來他終于找到了原因,簡單地說:

計算機將小數部分0.55轉換成二進制時會形成一個“0011”組合的無限循環,從而造成誤差。解決辦法是盡量用decimal類型替換double類型。

這位年輕的程序員將他的這次編程經歷記錄在了微博上,一不小心被小編扒了出來,于是IT之家就有了這篇關于“世界上只有10種人,一種懂二進制、另一種不懂”的文章(如圖1)。

當然,除了上面的這位同學之外,小編還發現一位名叫周花卷的大牛也遇到了類似的問題,他在谷歌Chrome瀏覽器的開發者控制臺(Win環境下F12/Mac環境按Command+Option+I可以打開一個“開發者工具”窗口,然后點上面的“Console”標簽,你會看到一個控制臺窗口)里輸入“0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1”(一共10個0.1),按下回車后結果竟是0.99999999999999,這個問題同樣也是二進制造成的(如圖2)。

OK,下面進入正題,小編接下來要用更專業的解釋來帶大家飛,不懂二進制的也可以學習一下哈。

要搞清楚這個問題,我們先來理解一下進制的概念。在十進制中,一位數字我們可以使用0到9,比9多的時候就會變成10,這就是一個兩位數了,也就是進位了,二進制也是一樣,只不過一位數字只能使用0和1,再多就要進位了。那么進制的本質又是什么呢?我們隨便拿一個十進制的數字來看一看(如圖3):

看懂了沒?一個十進制數實際上就是其中每一位數依次乘以10的0、1、2…次冪(權重),然后再把結果加起來,那么以此類推,二進制里面就是把上面的10換成2唄,我們來看一個(如圖4):

于是二進制數1001也就是十進制數的9。到這里似乎還沒什么問題,因為我們只討論了整數呢,每一個十進制整數都可以轉換成一個二進制整數,反過來,每一個二進制整數也都可以轉換成一個十進制整數。不過,如果把小數也加進來呢?先看一個十進制的小數(如圖5):

看懂了沒?其實就是把10上面的指數變成了負數而已,不難吧。那么以此類推,二進制的小數也就是把10換成2唄,我們來看一個(如圖6):

上面我們理解了進制的一些本質特性,算不過來也沒關系,我們暫且先不管它,不過,這跟我們遇到的問題到底有什么關系?別急,我們再看一下當引入小數之后,進制之間的轉換到底出了什么Bug。我們知道實數的數軸是連續的,每兩個數字之間的部分是可以被無限分割的,舉個例子,0和1之間的這部分,如果用十進制一位小數來分割的話,可以分成10份,也就是0.1、0.2、0.3……0.9、1,如果用二進制一位小數來分割的話,則只能分成兩份,也就是0.1(十進制的0.5)、1。你發現了什么問題?無論小數點后面增加多少位數字,二進制永遠只能以2來分割數軸,而十進制則是以10來分割數軸。

讓我們回想一下小學的數學知識,在十進制中,如果要用有限小數來表示一個分數的值,那么這個分數的分母(化簡之后)一定不能包含除了2和5以外的其他質因數,因為十進制以10來分割數軸,而10分解質因數的結果為2×5。舉個例子:1/8、1/10、1/25都可以換算成有限小數(分別是0.125、0.1、0.04),因為這些分數的分母分解質因數之后只包含2或者5(8=2×2×2、10=2×5、25=5×5),而當分母包含其他質因數時,例如1/3、1/7、1/18這些則無法用有限小數來表示(也就是俗話說的“除不盡”)。如果我們把這個規律套用到二進制上會怎么樣呢?2本身就是一個質數,無法分解質因數了,因此在二進制中,如果要用有限小數來表示一個分數的值,那么這個分數的分母一定只能包含2這一個質因數,換句話說,分母必須為2的冪(2、4、8、16、32……)。

好了,我們回頭看看開頭的題目,0.1換算成分數就是1/10,而1/10的分母是10,10并不是2的冪,因此,在二進制中并不能用有限小數來表示1/10這個值。事實上,如果將0.1轉換成二進制,我們會得到一個無限循環小數:0.000110011001100……看到這里,很多人估計已經想明白了,沒錯,計算機的精度是有限的,并不能直接處理無限小數,對于無限小數必須要截短到某個位置把它變成有限小數,但截短之后這個數就不準了,必然就產生了一點誤差,而連續加10次會將這種誤差放大,當誤差被放大到一定程度時,計算的結果就會出問題了,于是我們就看到了開頭的那一幕。如果用十進制來類比的話,大家可以想象一下,1/3+1/3+1/3=1,但1/3只能用無限循環小數來表示,即0.333333……,如果我們將它截短到某一位,假設截到0.333,那么0.333+0.333+0.333=0.999,你看,同樣也會出問題。

問題的原因總算搞清楚了,不過感覺很坑爹啊,計算機居然算不準小數,但為什么平時大家很少因此遇到問題呢?那是因為大多數用戶都不用編寫程序,但對于整天編寫程序的程序員來說,這樣的問題其實經常遇到。比如說,如果你在一段程序中需要讓計算機判斷0.1+0.1+0.1+0.1+0.1+0.1+0.1+ 0.1+0.1+0.1是否等于1,計算機會告訴你不等于1,坑爹吧?如果這段程序涉及算錢,有時候就會錯得很離譜,因此有經驗的程序員在碰到小數計算的時候都會特別小心。當然,作為一般用戶我們平時根本不需要關心這樣的問題,不過計算機居然會算錯數,怎么想都覺得挺奇妙的吧?

猜你喜歡
計算機
計算機操作系統
穿裙子的“計算機”
趣味(數學)(2020年9期)2020-06-09 05:35:08
基于LabVIEW的計算機聯鎖仿真系統
基于計算機自然語言處理的機器翻譯技術應用與簡介
科技傳播(2019年22期)2020-01-14 03:06:34
計算機多媒體技術應用初探
科技傳播(2019年22期)2020-01-14 03:06:30
信息系統審計中計算機審計的應用
消費導刊(2017年20期)2018-01-03 06:26:40
計算機應用軟件開發技術的幾點探討
電子制作(2017年14期)2017-12-18 07:08:10
計算機網絡安全
iLOCK型計算機聯鎖開發中的需求開發管理
計算機聯鎖系統配置軟件設計與實現
主站蜘蛛池模板: 精品一區二區久久久久久久網站 | 国产一区二区免费播放| 日韩精品亚洲一区中文字幕| www.91中文字幕| 国产成人免费观看在线视频| 狠狠亚洲五月天| 国产成人超碰无码| 成人在线欧美| 日韩午夜伦| 特级精品毛片免费观看| 欧美a在线视频| 国产成人亚洲日韩欧美电影| 欧美中文一区| 国产福利在线观看精品| 久久精品66| 国内精品久久久久久久久久影视| 国产精品亚洲一区二区三区在线观看| 欧洲高清无码在线| 国产美女自慰在线观看| 国产精品第一区在线观看| 日韩小视频在线播放| 国产欧美视频一区二区三区| 伊人久久婷婷| 国产精品9| 日本高清有码人妻| 亚洲成aⅴ人在线观看| 久久夜色精品国产嚕嚕亚洲av| 在线观看国产精品第一区免费 | 亚洲天堂免费观看| 日韩最新中文字幕| 白丝美女办公室高潮喷水视频| 国产伦片中文免费观看| 国产一区二区视频在线| 亚洲国产理论片在线播放| 亚洲一级无毛片无码在线免费视频| 成人免费视频一区二区三区| 亚洲αv毛片| 2020精品极品国产色在线观看| 一本色道久久88| 国产真实乱人视频| 欧美成人手机在线视频| 成年人视频一区二区| 香蕉伊思人视频| 91在线一9|永久视频在线| 亚洲伊人天堂| 亚洲大学生视频在线播放| 免费无遮挡AV| 精品国产Av电影无码久久久| 久久国产精品嫖妓| 亚洲综合在线网| 女高中生自慰污污网站| 成人午夜网址| 一级毛片不卡片免费观看| 五月婷婷欧美| 亚洲欧美天堂网| 亚洲精品图区| 热99re99首页精品亚洲五月天| hezyo加勒比一区二区三区| 欧美成a人片在线观看| 毛片国产精品完整版| 国模沟沟一区二区三区| 日韩黄色在线| 国产人人乐人人爱| 午夜福利无码一区二区| 国产人人乐人人爱| 久久无码高潮喷水| 欧美特黄一级大黄录像| 91蝌蚪视频在线观看| 九九热精品在线视频| 亚洲人成网站色7799在线播放| 亚洲精品福利视频| 日韩在线中文| 无码免费视频| 亚洲精品无码AⅤ片青青在线观看| 国产精品刺激对白在线| 亚洲免费毛片| 国产欧美专区在线观看| 国产男女XX00免费观看| 亚洲欧美国产高清va在线播放| 国产剧情国内精品原创| 亚洲清纯自偷自拍另类专区| 夜精品a一区二区三区|