浮點運算為什麼不準?有人為0.30000000000000004建了個網站
浮點運算一直非常玄學。
任何一個學過小數點運算的擁有小學數學水平的人,都應該知道 1.0-0.9=0.1。然而當你把這個問題拋給可以計算出圓周率小數點後上百位、擁有超強算力的計算機的時候,結果總是非常迷。
你會發現,使用double或者float得出的計算結果,總是跟我們的預期有一點點差距,這就使得浮點運算容易讓人覺得“不精確”。
實際上,因為我們人類理解的數字是十進位制,而計算機理解的數字是二進位制。比如101.11這個數字,在人類眼中是一百零一點一一,而在電腦看來則是1 * 2^2 +0 *2^1 + 1*2^0 + 1*2^-1 + 1*2^-2 = 4+0+1+1/2+1/4 = 5.75,這個差距著實有點可怕的。
用二進位制來表達十進位制的小數點,彷彿在接兩根口徑不一致的管子,就會出現總是對不上的情況。比如為了表示0.2這個十進位制下的數字,二進位制只能用 1/(2^n)來表示小數,於是:
0.01 = 1/4 = 0.25 ,太大
0.001 =1/8 = 0.125 , 又太小
0.0011 = 1/8 + 1/16 = 0.1875 , 逼近0.2了
0.00111 = 1/8 + 1/16 + 1/32 = 0.21875 , 又大了
0.001101 = 1/8+ 1/16 + 1/64 = 0.203125 還是大
0.0011001 = 1/8 + 1/16 + 1/128 = 0.1953125 這結果不錯
0.00110011 = 1/8+1/16+1/128+1/256 = 0.19921875
……
當然,理論上是可以做到無限逼近的。然而我們的物理儲存介質的容量畢竟不是無限擴充套件的,那麼在程式語言中就會採用一些取巧的方式來進行權衡。比如java中規定double是32位,float是64位。但無論是多少位,總之是個博弈的結果,並不能完美的解決上述問題,甚至在不同平臺、硬體下,同樣的操作、同樣的位數,得出的結果都可能不一樣,更不用說在不同的程式語言環境下了。
比如0.1+0.2,結果如下:
有人因此建立了一個網站:
https://0.30000000000000004.com/
正是因為浮點運算的精度問題,使得其無法應用在像銀行這樣對數字極度敏感的場景中。銀行使用的是定點計算,簡單來說,就是把小數轉換為整數的一種計算。因為這樣操作,所有的賬目都是可以預測的。
但浮點運算可以表示比的範圍比整數更大、在大數運算中也更有優勢,它天生是為表示超大數或者無限值。因此在類似圖神經網路這種注重數量大於精度的場景下,才是浮點運算大顯身手的地方。
轉自:新智元
- END -
如果看到這裡,說明你喜歡這篇文章,請轉發、點贊。掃描下方二維碼或者微信搜尋「perfect_iscas」,新增好友後即可獲得10套程式設計師全棧課程+1000套PPT和簡歷模板,向我私聊「進群」二字即可進入高質量交流群。
↓掃描二維碼進群↓
喜歡文章,點個在看
相關文章
- 阿里巴巴為什麼建議使用BigDecimal進行浮點數運算阿里Decimal
- 網站為什麼會打不開網站
- 為什麼計算機對浮點型數字計算存在誤差計算機
- 面試官瘋了嗎,問我為什麼浮點數不精確?面試
- discuQ 這個蛋為什麼沒有人喜歡?
- 為什麼個人和企業都需要有個網站?網站
- 為什麼我們越來越不喜歡用網站?網站
- 網站為什麼會存在漏洞網站
- 為什麼說六西格瑪不僅僅是資料運算
- 網際網路運營者為什麼要會運用熱點思維?
- 為什麼我不選擇React、Vue.js作為SAAS網站的前端框架ReactVue.js網站前端框架
- 為什麼網站訪問速度很慢網站
- 程式設計沒點為什麼,生活就是十萬個為什麼程式設計
- 網站建設之企業為什麼要做網站?網站
- 程式中算錢不能用浮點型別是個什麼坑?型別
- 網站為什麼要做“等保”?怎麼做?網站
- 為什麼網站使用CDN加速這麼流行?網站
- 為什麼計算機採用補碼進行運算?計算機
- 為什麼用CDN給你網站加速?網站
- 公司網站為什麼亂碼了呢網站
- 為什麼我的 WordPress 網站被封了?網站
- 網站為什麼需要使用CDN加速?網站
- 為什麼說CDN有利於網站網站
- 深入理解浮點數的運算
- 大模型不會推理,為什麼也能有思路?有人把原理搞明白了大模型
- 有符號浮點運算的基本步驟:以雙線性插值為例符號
- 為什麼會出現浮動和什麼時候需要清除浮動?清除浮動的方式?
- CDN是什麼?為何要用CDN加速網站?網站
- 為什麼說雲端計算運維是新“貴”?運維
- 為什麼有人不推薦使用spring官方推薦的@Transactional宣告式註解Spring
- python中精確的浮點數運算Python
- Python做浮點數(float)運算要小心Python
- 為什麼要特徵標準化特徵
- JavaScript解決浮點數算數運算精度問題JavaScript
- 為什麼網站安裝SSL證書如此重要?網站
- 運維為什麼要學開發?linux運維學習難不難運維Linux
- 為什麼網站使用CDN加速後,網站訪問速度反而變慢了?網站
- 網站最佳化為什麼要用BlueHost站群伺服器網站伺服器