什麼?計算機也會算錯數?

2020-12-13 百家號

人們通常不會懷疑計算機在數學計算上的結果,畢竟,如果連數都算不對,那還叫什麼「計算機」啦?其實,有個簡單的題目就能讓計算機算錯,不信我們試試看。

如果你用Chrome瀏覽器的話,按下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),按下回車,看看結果是什麼?

矮馬,嚇死本寶寶了,明眼人一看就知道算錯了是吧?10個0.1加起來應該等於1啊!不過如果你試一下「0.1*10」,咦,這次結果又對了!這什麼鬼?好吧,放心,你的電腦沒壞,我們來看看這到底是怎麼回事。

稍早接觸計算機的那一代人幾乎都知道計算機的內部運算都是以二進位來進行的,然而現在的用戶恐怕早就不關心這件事了。自從馮·諾依曼提出現代計算機架構以來,幾十年了計算機的原理都沒有什麼根本性的變化。我們人類在日常生活中通常使用十進位,有一種說法認為這是因為人有10個手指,但在電路設計上要表示10個狀態可就相當困難了,不過很多元件都可以很容易地表示兩個狀態,比如開和關,電平高和低,因此採用二進位對於計算機來說是一個最方便的設計。而正是因為人類和計算機使用的進位不同,因此在進行計算時,就必然會涉及到進位的轉換,也就是說,我們在屏幕上輸入的是十進位的數字,然後計算機要將它轉換成二進位進行計算,然後再把計算的結果轉換成十進位顯示出來。之所以上面那個題目計算機會算錯,本質上說就是二進位惹的禍。

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

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

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

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

上面我們理解了進位的一些本質特性,算不過來也沒關係,我們暫且先不管它,不過,這跟我們遇到的問題到底有什麼關係?別急,我們再看一下當引入小數之後,進位之間的轉換到底出了什麼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,坑爹吧?如果這段程序涉及到算錢,有時候就會錯得很離譜,因此有經驗的程式設計師在碰到小數計算的時候都會特別小心。當然,作為一般用戶我們平時根本不需要關心這樣的問題,不過計算機居然會算錯數,怎麼想都覺得挺奇妙的吧?

產品建議及投訴請聯繫:shoujibaidu@baidu.com

相關焦點

  • 圓周率是算不盡的無理數,若哪天它算盡了,會產生什麼嚴重後果?
    不過很多人都不理解,圓周率那麼長一串,有什麼意義呢?最後咱們計算的時候最多也就取兩位小數而已。今天我們就來說一說:圓周率是算不盡的無理數,若哪天它算盡了,會產生什麼嚴重後果?搞圓周率很早就被中國人所知曉,不過那時候人們眼中的圓周率是一個非常模糊的數據。
  • 2020世界計算機大會「算」的是什麼?
    參加開幕式及主論壇的觀潮君看到了很多本事大的人,比如,華為公司高級副總裁、雲與計算事業部總裁侯金龍,戴爾科技集團全球副總裁、中國研發集團總經理劉偉,奇安信集團董事長齊向東等,他們開口便放大招,各種計算機領域專業術語讓人極度燒腦,時代最尖端的計算機技術展望讓人「不明覺厲」。常言道,人算不如天算。這場大會卻演繹了什麼叫天算不如人算。
  • 圓周率是算不盡的無理數,若是哪天它算盡了,後果將會有多嚴重
    2019年3月14日,谷歌宣布圓周率計算已經達到了小數點31.4萬億位,不過在我們平常的生活當中使用圓周率換算是3.14,這是一個近似值,真正的圓周率是一個無理數,根本就算不盡。
  • 量子計算機算力有多強?可能是無數平行宇宙中的計算機在同時計算
    我們在生活中看到類似的詞彙基本分為兩種情況:1)打著「量子」的旗號做的「偽科學」產品,什麼量子運動鞋啊等等等等,本質屬於詐騙;2)雖然不是詐騙,但往往只是打「擦邊球」,本質與量子力學絲毫無關。那麼量子計算機的原理到底跟量子力學有關嗎?
  • 印度數學天才,心算比計算機還快10秒,華羅庚看後質疑:她算錯了
    而在印度的歷史上卻出現過這樣一位數學天才少女,她並沒有受過什麼高級的教育,甚至都沒有金國一次學堂。可她卻有著非常強大的心算能力,對於高位數的運算全憑大腦就可以完成,甚至比計算機還快10秒。但是我國著名數學家華羅庚卻在看了結果後表示了質疑,直言她算錯了,這是怎麼回事呢?
  • 印度數學天才,心算速度超過計算機,華羅庚看了一眼:她算錯了
    泰戈爾的詩拯救不了現代社會的快文化,什麼都要追求快,越快越好。計算機在不斷的發展,社會在日新月異的進步。只要稍微停留住一段時間,一個人便會從這個社會脫節,再也不知道人們所說的事件是什麼。從「快」這個字上說,所有的人腦都比不過計算機。不過在上個世紀的時候,印度曾經有一名女性,她的心算能力還真就比計算機要更快。
  • 量子計算機有多厲害?能算盡π嗎,為什麼說算盡後數學體系會崩塌
    量子計算機則更快,根據《科學》雜誌最新的公布,我國的「九章」量子計算機比目前最快的超級計算機還要快一百萬億倍!一百萬億是多少呢?是一個讓你數零都會數懵的數。 量子計算機到底有多牛呢?
  • 印度天才少女,心算速度比電腦還快,華羅庚看了一眼:算錯了
    小時候的沙昆塔拉家境並不好,一家靠馬戲團的表演為生,所以也沒有什麼機會接受正規的教育。也就是處於這樣一個環境下,沙昆塔拉卻展示出了驚人的學習天賦。有一次,她的哥哥正在算一道三位數的立方根,沙昆塔拉好奇地湊過去一看,自信地和哥哥說自己會做這道題。哥哥當時覺得沙昆塔拉幾乎沒有接觸過數學,又怎麼可能算出這麼難的題目呢?
  • 減法都算錯?安卓驚爆計算器低級錯誤Bug
    最近小編我在網上閒逛的時候發現有很多用戶都在反映一個非常驚悚的問題:使用Android手機內置的計算器時有些最簡單的減法都會算錯,例如14.52-14.49,再例如8.03-7.96,具體結果各位網友請趕緊拿出自己手上的Android手機算算吧,如果沒有Android手機的話,那就只能看小編我來算了
  • 什麼帳戶隨機數?隨機數的作用是什麼?
    (什麼帳戶隨機數?隨機數的作用是什麼?| 金色百科)  那麼隨機數在比特幣區塊鏈中的作用是什麼呢?  在比特幣區塊鏈中,所有參與節點都在遍歷尋找一個隨機數,節點算力輸出越大就越有可能遍歷到這個隨機數,也就能夠搶到這一輪的記帳權,這個過程通常被稱為「挖礦」。各參與節點在遍歷隨機數的過程中也在不斷地驗證其他節點的交易信息,搶到記帳權的節點會把所有相關的信息廣播出來,全網中所有參與節點在共同驗證了廣播出來的信息之後就會形成一個區塊,緊接在上一個區塊的後面,形成一條區塊數據鏈。
  • 如果圓周率有一天算盡了,會發生什麼?可能是我們不想看到的結果
    當人類走進科技時代之後,發明了計算機之後,科學家計算圓周率已經不再用手工,而是用超級計算機。超級計算機的強大,相信大家都是明白的。如果人類通過手工計算圓周率,可能現在也就是算到了幾十萬位。而通過超級計算機目前已經將圓周率計算到了小數點後10萬億位,這是天與地的差距,由此可見,計算機可以稱得上是人類進入科技時代以來最偉大的發明之一。
  • 計算機大數乘法引發的思考|CSDN 博文精選
    但是這裡面有個根本的問題,猜猜看是什麼?…一位乘法對於人類而言是可以直接計算的,99乘法表都會背,我們計算4×7的時候,沒有必要擺4排的7,然後數一數一共有多少,而是脫口而出28。對於人類而言,超過一位的數字乘法就屬於大數了,人們不會把12×89這種計算的結果背下來,那就需要某種技巧去拆解多位數字,利用巧算來減少計算步驟了。
  • 印度的數學天才,心算比計算機還快10秒,華羅庚瞟了一眼:她算錯了
    歷史是什麼:是過去傳到將來的回聲,是將來對過去的反映。——雨果 斯裡尼瓦瑟·拉馬努金是印度史上最著名的數學家之一,他雖然沒有接受過正規的高等數學教育,但由於斯裡尼瓦瑟·拉馬努金沉迷於數學的世界,並且遇上自己的伯樂,從而沒有埋沒自己的數學天賦。
  • 圓周率都已算到31.4萬億位,為什麼超級計算機還在算圓周率?
    在今年的圓周率日(3月14日)當天,人類打破了一項新的世界紀錄——圓周率的小數位被前所未有地算到了31.4萬億位。那麼,不斷計算圓周率有什麼實際意義呢?難道數十萬億小數位的圓周率還不夠用嗎? 早在三千多前,人們就已經開始使用圓周率。古人發現,無論是多大的圓,它的周長和直徑之比總是一個固定的常數,這就是圓周率。但圓周率一直沒有被精確計算出來,人們想盡一切辦法來提高計算圓周率的精度。
  • 人類一直在想辦法計算圓周率,如果圓周率算完了會改變數學嗎?
    人類一直在想辦法計算圓周率,如果圓周率算完了會改變數學嗎?,不過最後的答案都是一樣的,那就是不論怎麼算也沒有辦法將圓周率算完,對此有人就提出了一個設想,如果圓周率被算完了,那麼世界會怎樣,會不會直接改變數學呢?
  • 量子計算機究竟是什麼丨回形針
    這是由中科大潘建偉團隊與中科院上海微系統與信息技術研究所、國家並行計算機工程技術研究中心合作,構建出的 76 個光子的量子計算原型機。今天,我們將用幾枚硬幣,向你解釋量子計算機的基本原理。我們現在使用的計算機軟體,背後是一行行代碼,它們最終轉化成各種邏輯門,控制底層的一個個二進位數—— 0 和 1。
  • 當年印度天才少女心算巨大數學題,華羅庚稱其算錯了,如今怎樣?
    導語:當年印度天才少女心算巨大數學題,華羅庚稱其算錯了,如今怎樣?提到「天才」這兩個字,可能大家都不會陌生了。天才被心理學上稱有超常智力的人物,而且天才可以形容一個人的某種特殊才能,也可以用在通曉各方面學問的博學家。
  • 量子計算機「九章」問世:冷眼與嘲笑中,中國超算起步了
    目前,量子計算機仍然處於實驗室研發階段,要成為主流計算技術還需要數年時間。回首超算領域的發展,中國經歷了很多,也成就了很多。早在今年6月,TOP500組織發布第55屆全球超級計算機TOP500榜單顯示,中國部署的超級計算機數量蟬聯全球第一,中國的神威太湖之光和天河2A分別位列第四和第五位。
  • 用量子計算機改變世界,清華大學物理系張浩:不止更快
    除了這些,量子技術到底會是一場怎樣的革命?快來看看清華大學物理系副教授張浩的分享。 因為我們研究量子科學,所以我們想做的是下一代的量子晶片,就是所謂的量子計算機。大家可能聽過太多次量子計算這個詞了,量子計算到底比經典計算機強在什麼地方?其實很簡單,它就是算的快。有多快,快到就是,給你舉個例子,比如說因數分解,大家可能小學、中學都學過因數分解,是吧?比如說我告訴你一個數,問你它等於哪兩個數的乘積,你要告訴我,比如說15=3×5。
  • 人類的超級計算機一直算圓周率!這樣的意義何在呢?漲知識了
    人類的超級計算機一直算圓周率!這樣的意義何在呢?漲知識了圓周率是我們從小在學數學的時候,課本上有的,記得當時老師還要求背誦圓周率後面的二十位,真的是印象深刻,是接觸的第一個無線不循環小數。到現在小編都想問,難道圓周率真的如課本上說的一樣算不盡嗎?會不會有一天算出來了呢?人類的超級計算機一直算圓周率!這樣的意義何在呢?漲知識了隨著時間的流逝,科學的進步,我們很多時候都感覺國內科學水平是發展迅速的,但是對圓周率還是沒辦法,就算電腦有很多的數據作為資源,還是沒有解開圓周率的能力。