浮點運算為什麼不準?大數運算中也更有優勢

2021-02-24 Python開發與大數據人工智慧

浮點運算一直非常玄學。

任何一個學過小數點運算的擁有小學數學水平的人,都應該知道 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/

正是因為浮點運算的精度問題,使得其無法應用在像銀行這樣對數字極度敏感的場景中。銀行使用的是定點計算,簡單來說,就是把小數轉換為整數的一種計算。因為這樣操作,所有的帳目都是可以預測的。

但浮點運算可以表示比的範圍比整數更大、在大數運算中也更有優勢,它天生是為表示超大數或者無限值。因此在類似圖神經網絡這種注重數量大於精度的場景下,才是浮點運算大顯身手的地方。

長按掃碼,關注公眾號

喜歡就點個在看再走吧



相關焦點

  • 浮點運算為什麼耗時很多?
    浮點運算就是實數運算,因為計算機只能存儲整數
  • ARM 浮點運算詳解
    一:早期ARM上的浮點模擬器:早期的ARM沒有協處理器,所以浮點運算是由CPU來模擬的,即所需浮點運算均在浮點運算模擬器(float math emulation)上進行,需要的浮點運算,常要耗費數千個循環才能執行完畢,因此特別緩慢。
  • 三菱PLC浮點運算應用指令
    浮點運算應用指令能實現浮點數的轉換、比較、四則運算、開方運算、三角函數等功能,浮點運算應用指令大都為32位指令。一、二進位浮點比較與區間比較指令本文引用地址:http://www.eepw.com.cn/article/201612/331348.htm二進位浮點比較ECMP指令比較源操作數S1與源操作數S2內的32位二進位浮點數,根據大小一致比較結果,對應輸出驅動目的操作數D指定軟元件開始的連續3個位軟元件的狀態,二、二進位浮點數與十進位浮點數轉換指令二進位浮點數轉換為十進位浮點數
  • 比拼浮點運算速度 超算排行榜是這樣「算」出來的
    6月17日,新一期全球超算500強榜單出爐,入選500強的所有超算浮點運算速度都突破每秒千萬億次,中國超算也在前四佔有兩席位置。普通計算機用指令運算速度衡量計算性能,而超算通常用浮點運算速度來衡量其性能。那麼,什麼是浮點運算速度,超算榜單為什麼會選擇浮點運算速度來進行比較?
  • 基於複數浮點運算的協方差矩陣的FPGA實現
    1.3 定點數到浮點數的轉換  定點計算在硬體上實現簡單,計算速度比浮點計算要快,但是表示操作數的動態範圍受到限制,浮點數計算硬體實現比較困難;一次計算花費的時間也遠大於定點計算的花費,但是其表示的操作數動態範圍大
  • Xilinx Vivado HLS中Floating-Point(浮點)設計介紹
    而Floating-Point具有更大的數據動態範圍,從而在很多算法中只需要一種數據類型的優勢。 Xilinx Vivado HLS工具支持C/C++ IEEE-54標準單精度及雙精度浮點數據類型,可以比較容易,快速地將C/C++ Floating-Point算法轉成RTL代碼。
  • python教程之python數學運算
    ,math.isinf(float(b))) #輸出true#decimal模塊:decimal意思為十進位,這個模塊提供了十進位浮點運算支持from decimal import Decimalnum1=Decimal('0.5534')num2=Decimal('0.427')num3=Decimal('0.37')
  • 數學運算(四)——帶符號整數的運算
    數學運算(一)—— 無符號數加法器數學運算(二)——無符號數乘法器結構數學運算(三)——無符號數除法器
  • 基於FPGA的高速流水線浮點乘法器設計與實現
    同時由於基於IEEE754 標準的浮點運算具 有動態範圍大,可實現高精度,運算規律較定點運算更為簡捷等特點,浮點運算單元的設計 研究已獲得廣泛的重視。設參與運算的兩個數A、B 均為單精度浮點數, 即:    2.2 浮點乘法器的硬體系統結構  本設計用於專用浮點FFT 處理器,因此對運算速度有較高要求。為了保證浮點乘法器 可以穩定運行在80M 以下,本設計採用了流水線技術。
  • 十進位數的編碼與運算
    十進位數的編碼與運算 佚名 發表於 2009-10-13 17:14:40 十進位數的編碼與運算  十進位數的每一個數位的基為10,但到了計算機內部,出於存儲與計算方便的目的,必須採用基2碼對每個十進位數位進行重編碼
  • 數學運算(一)——無符號數加法器
    數學運算(一)—— 無符號數加法器數學運算(二)——無符號數乘法器結構(待更)數學運算(三)——無符號數除法器(待更
  • 2019中考數學知識點:有理數的運算
    有理數的運算:   加法:①同號相加,取相同的符號,把絕對值相加。②異號相加,絕對值相等時和為0;絕對值不等時,取絕對值較大的數的符號,並用較大的絕對值減去較小的絕對值。③一個數與0相加不變。   減法:減去一個數,等於加上這個數的相反數。   乘法:①兩數相乘,同號得正,異號得負,絕對值相乘。
  • 基於FPGA的複數浮點協方差矩陣實現
    每種陣列模型都有各自的特點,加之陣元數目的取值不同,也會導致陣列流型的對稱性變化。針對不同的陣元模型和陣元數,數據預處理的方法也會有所不同。 對於數據預處理的研究,目前已經有了一些比較成熟的算法。本文以空間譜估計作為研究背景,研究了複數據運算和浮點運算的特點,提出了一種適用於任何陣列流型、任意陣元的基於複數浮點運算的協方差矩陣的FPGA實現方案。1 求解複數浮點協方差矩陣 以11陣元的均勻圓陣為例,其協方差矩陣的求解方案原理框圖如圖1所示。
  • 基於FPGA高精度浮點運算器的FFT設計與仿真
    關鍵詞 快速傅立葉變換;浮點;蝶形運算;VHDL FFT作為數位訊號處理中的重要的手段之一,主要在數字通信、語音信號處理、圖像處理、功率譜估計、仿真、系統分析、雷達理論、光學、醫學、地震以及數值分析等方面得到廣泛應用。基於FPGA實現FFT,具有軟體編程的靈活性及電路擴展性強等優點。
  • 向量數乘運算及其幾何意義
    一、向量的數乘運算的定義:1.定義:一般地,我們規定實數λ與向量a的積是一個向量,這種運算叫做向量的數乘,記作λa.2.特別地,我們有(-λ)a=-(λa)=λ(-a),λ(a-b)=λa-λb二、共線向量與向量的線性運算1.共線向量定理向量a(a≠0)與b共線,若且唯若有唯一一個實數λ,使得b=λa2.向量的線性運算向量的加、減、數乘運算統稱為向量的線性運算.對於任意向量a,b,以及任意實數λ,μ1,μ2,恆有λ(μ1a
  • 2021初中七年級代數知識點:有理數的運算
    中考網整理了關於2021初中七年級代數知識點:有理數的運算,希望對同學們有所幫助,僅供參考。   有理數的運算   1.有理數的加法:   加法一般步驟:   ①確定符號:同號取相同的符號。   異號取絕對值大的加數的符號。
  • 數學運算(三)——無符號數除法器
    數學運算(一)—— 無符號數加法器數學運算(二)——無符號數乘法器結構數學運算(三)——無符號數除法器
  • 除法的運算性質有哪些?
    在簡便計算中,加法的交換律、結合律以及乘法的交換律、結合律和分配律很多同學比較熟練。但是減法的性質和除法的性質在運算當中不容易靈活準確運用。現在我們通過幾個例題來看一下除法有哪些運算性質。第一個例題很多同學說,跟乘法分配律長得很像。
  • 全球超算500強榜單出爐:日本「富嶽」蟬聯冠軍,基於ARM架構運算...
    「富嶽」超算的ARM A64FX內核數量比上一輪評比增加了大約30萬,該系統在HPL基準測試中,打破了每秒442千萬億次浮點運算的新紀錄。實現93千兆次浮點運算。英偉達(Nvidia)內部的HPC-AI機器Selene上升了2個名次,最終獲得第五名。由中國國防科技大學開發、部署在廣州國家超級計算機中心的「天河2A」系統排名第六。它由Intel Xeon CPU和NUDT的Matrix-2000 DSP加速器驅動,在HPL上可以實現61.4千兆次浮點運算。
  • 對數運算與對數函數
    注意,這個時候是從B指向A,做了一次相反的運算。  其實我也不明白為什麼課本或者輔導書總是把這個原反函數的關係講得那麼隱晦,想讓讀者知道,又不想讓大家懂,真是隔靴搔癢,非常想把作者抓來打一頓。。。。。   對數運算就是指數運算的逆運算。既然如此,那麼它的運算原則和指數是一樣一樣的。  回憶一下兩大原則,質數原則和同底數原則。