前提: 學習過訊號處理,了解到在訊號處理中,我們能夠處理的都是數碼訊號,絕對不是模擬訊號。數碼訊號是離散訊號,模擬訊號是連續訊號。在這一思想基礎下,思考了為什麼會存在浮點數誤差問題。
為什麼不討論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 無法準確地表示某些帶小數的十進位制資料。下面我們來分析下 我們知道將乙個十進位制數值轉換為二進位制數值,需要通過下面的...