js中使用ieee-754規定的雙精度浮點數,所有的演算法也都符合ieee-754規定的雙精度浮點數運算。
雙精度浮點數是一種64位(64 bit)的二進位制數字格式。包括3個組成部分:
其中,符號位0表示正值,1表示負值;
指數部分儲存為無符號數字,可表示的十進位制數字範圍為[0, 2047]。由於指數可為正為負,因此在運算中引入了指數偏差量(exponent bias),在雙精度浮點數中這個值為1023(2^10 - 1),在指數運算中大於1023的表示指數為正,小於1023的表示指數為負。標準有效數的指數範圍為[-1022, 1023],指數-1023(全0)為0(signed zeros)和次正常數(subnormal numbers)保留,指數+1024(全1)為無窮數(infinities)和nans保留。
標準有效數在存入ieee-754二進位制交換格式中隱去了值總是為1的前導位(hidden bit),因此尾數的實際精度是53位。
事實上,11位寬度的階碼允許表示10^-308到10^308之間的數字(number.max_value),並且通過降低精度,允許表示的最小正值可以達到5e-324(number.min_value)。而53位的尾數能夠表示的精度的最大值為2^53(math.pow(2, 53)),ieee-754對15~17位的有效的十進位制數字的精度做出規定:
如果乙個最高15位有效數字的十進位制字串轉換為ieee-754雙精度表示,再轉換回同樣位數的十進位制字串,最終結果應該和原始字串一致;js在es6中首次定義了最大的安全整數常量(number.max_safe_value)和最小的安全整數常量(number.min_safe_value)。並給出了安全整數的定義: 為什麼最大安全整數常量為2^53 - 1,因為2^53雖然是能夠被表示的精度的最大值,但是並不安全。如果乙個ieee-754雙精度浮點數轉換為乙個最少17位有效數字的十進位制字串,再轉換回雙精度表示,最終結果比喻和原始數值一致。
9007199254740992 == 9007199254740993 //true
複製**
最後,在大數相加substr
演算法中使用的是-14,個人理解是因為規範明確給出了15位的十進位制字串轉換能夠確保精度,因此即使最大14位發生進製精度也是能夠確保的,而15位發生進製時也許會遇到一些不可知的情況。 單雙精度浮點數
浮點數並不一定等於小數 定點數也並不一定就是整數。所謂浮點數就是小數點在邏輯上是不固定的,而定點數只能表示小數點固定的數值,具用浮點數或定點數表示某哪一種數要看使用者賦予了這個數的意義是什麼。c 中的浮點數有6種,分別是 float 單精度,32位 unsigned float 單精度無符號,32位...
js高精度浮點數運算
貼 自定義高精度浮點數運算 物件格式寫法 var float calculator catch e m math.pow 10,math.max r1,r2 計算因子 return arg1 m arg2 m m minus function arg1,arg2 mul function arg1,...
浮點數的運算精度丟失
開啟python編譯器,輸入0.1 0.2,期待的結果是0.3,但是輸出為 0.30000000000000004 有點小尷尬,這是為什麼呢?其實這設計到了計算機的浮點數儲存是以二進位制進行儲存的。說二進位制不太形象,換成我們最長使用的十進位制和分數 1 5,使用小數表示為0.2,但是1 3,使用小...