為什麼浮點數一定是有誤差的

2021-08-07 10:13:32 字數 1798 閱讀 6050

前提: 學習過訊號處理,了解到在訊號處理中,我們能夠處理的都是數碼訊號,絕對不是模擬訊號。數碼訊號是離散訊號,模擬訊號是連續訊號。在這一思想基礎下,思考了為什麼會存在浮點數誤差問題。

為什麼不討論int整型會不會有誤差而浮點數一定要考慮誤差問題呢?

就是因為,本質上我們面對int整型時候,想要處理的資料就是整數,而整數本身就是離散的資料,…… -2,-1,0,1,2 …… ,計算機提供就是完全正確的所有整數,所以不存在問題。

但是,浮點數這邊就一定會出現問題,問題的實質「模數轉換」,浮點數是實數,浮點數必須是取樣得到的,我們無法將模擬訊號在計算機中完全表達。就是因為模擬訊號是連續的,而數碼訊號是離散的。我們必須考慮「模數轉換」的精度,這個問題是必須面對的。取樣週期的大小就是精度。

計算機中存放著的乙個浮點數值,可以看作是對實數域的乙個取樣點。

下面給出4張圖,以體現不同的取樣週期,方便意會。

我對二進位制數的乙個方面的觀點

浮點數簡記

階碼表示範圍是1-254,減去偏移量127就是-126到127。當階碼為0或255時有特殊用途。階碼為0,表示浮點數為0值;階碼為255,若尾數全0,表示無窮大,否則表示無效數字。根據符號位,還可以分為正負無窮和正負0。

(1 )特殊的浮點表示

浮點 0

0x00000000 = 00000000 00000000 00000000 00000000

浮點 -0

0x80000000 = 10000000 00000000 00000000 00000000

二進位制 0x7f800000 = 01111111 10000000 00000000 00000000

浮點 infinity

二進位制 0xff800000 = 11111111 10000000 00000000 00000000

浮點 -infinity

二進位制 0x7f800001 = 01111111 10000000 00000000 00000001

浮點 nan (not a number)

(2) 普通的浮點數

浮點 0.5

0x3f000000 = 00111111 00000000 00000000 00000000

浮點 -0.5

0xbf000000 = 10111111 00000000 00000000 00000000

浮點 0.75

0x3f400000 = 00111111 01000000 00000000 00000000

浮點 -0.75

0xbf400000 = 10111111 01000000 00000000 00000000

浮點和二進位制互轉**,很不錯。

by jack lu 2017-8-25 22:40:06

VBA研究 浮點數計算總是有誤差的

數字有兩種表達方式,一種是整數,一種是浮點數。浮點數是屬於有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體的說,這個實數由乙個整數或定點數 即尾數 乘以某個基數 計算機中通常是2 的整數次冪得到,這種表示方法類似於基數為10的科學計數法。計算機中儲存 浮點數的方式決定了浮點...

為什麼浮點型運算結果會有誤差?

如var a 0.65 var b 0.6 console.log a b 0.05?錯 a b 0.050000000000000044為什麼?其根本原因在於計算機所使用的01 無法準確地表示某些帶小數的十進位制資料。下面我們來分析下 我們知道將乙個十進位制數值轉換為二進位制數值,需要通過下面的計...

為什麼浮點型運算結果會有誤差?

如var a 0.65 var b 0.6 console.log a b 0.05?錯 a b 0.050000000000000044 為什麼?其根本原因在於計算機所使用的01 無法準確地表示某些帶小數的十進位制資料。下面我們來分析下 我們知道將乙個十進位制數值轉換為二進位制數值,需要通過下面的...