程序在99.99%的情況下是可靠的,但是有那麼0.001%你遇見過麼?

大多數人認為,計算機程序都是有嚴密的邏輯,每一步都是沒有任何歧義,因此程序是最值得信賴的,程序的計算結果是非常可靠的,比如說去超市買東西的時候,好多人拿到小票後只是會核查小票上的商品項及商品價格,但是從來不會有人拿著價格在自己累加一遍,因為大家都知道程序不可能算錯的,也沒有必要浪費這個時間不是麼?的確,在99.99%的情況下,程序都是正確的,如果不正確也是人的設計有問題,不過也真有那麼0.001%的情況下,程序也會出現“不靠譜”,好多人把這種問題歸結為“臨界點問題”。

程序在99.99%的情況下是可靠的,但是有那麼0.001%你遇見過麼?

這不,近期就有一位程序員朋友發現了一段代碼出現了“不靠譜”的行為,這名程序員網友用的是python語言(python2.7),他用四捨五入函數計算了2.4999999999999997與2.4999999999999998,得到的結果分別是2與3,在正常人的思維意識裡,結果肯定是2了,因為四捨五入嗎?畢竟這兩個數都是小於2.5的,這又是哪裡出問題了呢?我想肯定有一群碼農網友要爭著解釋這個問題了吧,讓我們來一起看看他們誰說的有道理吧!

程序在99.99%的情況下是可靠的,但是有那麼0.001%你遇見過麼?

網友一:cpu真是一個不靠譜的東西

上世是朵花:cpu:我不背這個鍋,我一向是按邏輯辦事的,都是按照你們設計的來的。

網友二:組成原理浮點數編碼瞭解下

上世是朵花:除了這種情況,有經驗的碼農都知道不能拿兩個浮點數做 相等比較,比如 不能 a == b ,而應該是 a-b <= 0.0001 這樣就看作是兩個數相等了,而如果直接用==比較得出的結果可能不是你想要的。

網友三:js是更神奇的語言

上世是朵花:沒錯,這樣的現象在js語言中也是同樣存在的,大家不妨試試其他語言,也有可能是這種情況。

網友四:從JAVA轉算法,無力吐槽python

上世是朵花:你倒是吐糟一下,讓大家都看看是什麼內容啊

程序在99.99%的情況下是可靠的,但是有那麼0.001%你遇見過麼?

網友五:py3不會這樣

上世是朵花

:這個沒有親自試過,有興趣的同學可以求證一下。

網友六:這你就不懂了吧,看看浮點數的精度就明白了

上世是朵花:能再具體點就好了,這只是大概,但是不夠具體

網友七:Python內部實現的問題,浮點數精度不背這個鍋

上世是朵花:不只是python是這樣啊,js也是同樣問題,親測,其他語言也很有可能有這種情況

網友八:踩過python和lua 針對64位整數問題的坑

上世是朵花:是的,我想大多數程序員都遇見過int溢出的問題,當數字達到一定程度後就變成了另一個數字了,64位計算機與32位計算機的具體臨界值是多少,大家可以網上查查,有興趣的可以去親自試驗一下。

程序在99.99%的情況下是可靠的,但是有那麼0.001%你遇見過麼?

程序是可靠的,但是這是有前提條件的,任何事情都是有邊界的,在邊界之內,他是可靠的,但是超出邊界可能就會出現意外的結果,這並不是說程序不可靠,因為程序是人設計的,什麼事情都不可能是絕對的完美,這個“臨界點”才是我們在實際項目中應該特別注意的,在實際工程中,多少年來,總有程序員會在這上面犯錯誤,小則是一個bug,大則是出現鉅額經濟損失,因此在這些臨界點上千萬不能馬虎,有些事情不能只是想當然,應用於工程之前,最好是先做個小實驗,確認沒問題時再應用於工程,程序雖然是可靠的,但是在一些邊緣性的地方,我們還是值得注意,這應該是設計上不足,我們千萬不能跳進這樣的坑,否則就會出現差之毫釐謬以千里。

以上所有圖片均來之互聯網

大家好,我是“上世是朵花”。如果你有什麼好的看法或者觀點可以在評論區展現你的才華,互動交流,如果想進一步瞭解我,那就關注我吧!


分享到:


相關文章: