摘要:類型使用的就是標準中的雙精度浮點數。數字的許多特性都依賴于此標準,例如令人費解的不等于這篇文章介紹標準中雙精度浮點數二進制儲存格式,并由此推出中數字的一些特性。
Javascript 作為一門動態語言,其數字類型只有 number 一種。 nubmer 類型使用的就是 IEEE754 標準中的 雙精度浮點數。Javascript 數字的許多特性都依賴于此標準,例如令人費解的 0.1+0.2不等于0.3
這篇文章介紹 IEEE754 標準中雙精度浮點數二進制儲存格式,并由此推出 js 中數字的一些特性。
一、IEEE754 中浮點數的儲存格式在 IEEE754 中,雙精度浮點數儲存為64位:
指數位可以通過下面的方法轉換為使用的指數值:
浮點數表示的值的形式由 $e$ 和 $f$ 確定:
$0.1 = (0.0dot0dot0dot1dot1)_2=(-1)^0 imes2^{-4} imes(1.dot1dot0dot0dot1)_2$
$0.2 = 0.1 imes2^1=(-1)^0 imes2^{-3} imes(1.dot1dot0dot0dot1)_2$
由于小數位 $f$ 僅儲存 52bit, 儲存時會將超出精度部分進行"零舍一入"
值類型 | 小數位(儲存范圍內) | 小數位(儲存范圍外) |
---|---|---|
無限精確值 | 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 | 1001 1001... |
實際儲存值 | 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 | - |
由于計算加減時不會對指數位進行位運算,這里不計算指數位的表示,直接使用數字表示最終的指數值
0.1、0.2 的表示如下:
浮點數數值 | 符號位 $s$ | 指數值 $E$ | 小數位 $f$ |
---|---|---|---|
0.1 | 0 | -4 | 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 |
0.2 | 0 | -3 | 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 |
在計算浮點數相加時需要先進行“對位”,將較小的指數化為較大的指數,并將小數部分相應右移
$0.1
ightarrow (-1)^0 imes2^{-3} imes(0.1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1101 0)_2$
$0.2
ightarrow (-1)^0 imes2^{-3} imes(1.1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010)_2$
$0.1 + 0.2 = (-1)^0 imes2^{-2} imes(1.0011001100110011001100110011001100110011001100110100)_2$
可以通過下面的方法檢驗計算結果是否于 js 中一致:
0.1 + 0.2 === (-1)**0 * 2**-2 * (0b10011001100110011001100110011001100110011001100110100 * 2**-52) //> true //計算正確三、計算 javascript Number 的特性
在js中 Number對象上附帶了許多屬性,表示可數的范圍等信息,例如 Number.MAX_SAFE_INTEGER 是一個16位的數字,這一部分將解釋如何計算出這些有特殊意義的數字。
1.計算 Number.MAX_VALUE 和 Number.MIN_VALUE當符號位為0、指數取到1023、小數位全為1時,為可表示的最大值
當符號位為0、指數位全為0(表示非規格浮點數)、小數位僅最后一位為1時,為可表示的最小正值
var max = (-1)**0 * 2**1023 * (Number.parseInt( "1".repeat(53) ,2) * 2**-52); max === Number.MAX_VALUE; //> true var min = (-1)**0 * 2**-1022 * (Number.parseInt( "0".repeat(52)+"1" ,2) * 2**-52); min === Number.MIN_VALUE; //> true2.計算 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER
Number.MAX_SAFE_INTEGER 表示最大安全整數,它是9開頭的16位數字,也表明js number最大精度不超過16位。
ECMASCRIPT-262 定義:
The value of Number.MAX_SAFE_INTEGER is the largest integer n such that n and n + 1 are both exactly representable as a Number value.
http://www.ecma-international...
改變指數位為53,這讓每個小數位都表示浮點數的整數部分,小數位最低位對應 $2^0$,然后將每個小數位都置1,可得最大準確整數:
var max_safe_int = (-1)**0 * 2**52 * (Number.parseInt("1".repeat(53),2) * 2**-52); max_safe_int === Number.MAX_SAFE_INTEGER; //> true //當它 +1 時,可由 (-1)**0 * 2**53 * (Number.parseInt("1"+"0".repeat(52),2) * 2**-52) 正確表示,而再 +1 時則無法準確表示 //符號位取反可得最小安全整數 -1 * max_safe_int === Number.MIN_SAFE_INTEGER;3.計算 Number.EPSILON
Number.EPSILON 是一個極小值,用于檢測計算結果是否在誤差范圍內。例如:
Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON; //> true //2017-9-27 補充 1.1 + 1.3 - 2.4 < Number.EPSILON //> false
根據 ECMASCRIPT-262 定義:
The value of Number.EPSILON is the difference between 1 and the smallest value greater than 1 that is representable as a Number value, which is approximately 2.2204460492503130808472633361816 x 10???16.
http://www.ecma-international...
根據定義Number.EPSILON是大于1的最小可表示數與1的差,可以據此計算出 Number.EPSILON 的值:
//將表示1的二進制小數位的最左端置1,可表示大于1的最小數 var epsilon = (-1)**0 * 2**0 * (Number.parseInt("1"+"0".repeat(51)+"1",2) * 2**-52) - 1; // (-1)**0 * 2**0 * (+`0b1${"0".repeat(51)}1` * 2**-52) - 1; epsilon === Number.EPSILON; //> true
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81417.html
摘要:而的浮點數設置的偏移值是,因為指數域表現為一個非負數,位,所以,實際的,所以。這是因為它們在轉為二進制時要舍入部分的不同可能造成的不同舍 IEEE 754 表示:你盡管抓狂、罵娘,但你能完全避開我,算我輸。 一、IEEE-754浮點數捅出的那些婁子 首先我們還是來看幾個簡單的問題,能說出每一個問題的細節的話就可以跳過了,而如果只能泛泛說一句因為IEEE754浮點數精度問題,那么下文還是...
摘要:數字數字都是浮點數,按照標準進行存儲。因此,只有偶數可以在范圍內表示。但只有超過指數的上限才稱為中的溢出。結論在這篇博文中,我們研究了如何將其浮點數轉換為位。 JavaScript中的所有數字都是浮點數。這篇博客文章解釋了這些浮點數如何在64位二進制內部表示。由于特別考慮,本文中的數字將用整數表示,以便在閱讀本文后,您將了解在以下交互中會發生什么: (譯者注:浮點數并不一定等于小數,定...
摘要:吐槽一句,大二的專業課數字邏輯電路終于用在工作上了。,整數位為,且精度只到十分位,因此是。如果是不限精度的話,轉換后的二進制數應該是無限循環。再看一下百科給出的標準因此,的類型,最高的位是符號位,接著的位是指數,剩下的位為有效數字。 showImg(https://segmentfault.com/img/remote/1460000011902479?w=600&h=600); 用一...
摘要:一復習進制轉進制整數部分除取余,逆序小數部分乘取整,正序在線工具二了解雙精度浮點數規范通過進制的科學計數法存儲。最終可表示為圖片來源其中,,都是實際存儲科學計數法的值。 一、復習10進制轉2進制 1)整數部分:除2取余,逆序2)小數部分:乘2取整,正序在線工具 二、了解IEEE 754雙精度浮點數規范 1) 通過2進制的科學計數法存儲。 和10進制的科學計數法類似,二進制的科學技術法格...
摘要:進制之謎眾所周知,計算機在設計之初,出于各方面角度考慮,最終采用二進制的格式來存儲數據。同樣的情況,也會出現在十進制和二進制的轉換中。當我們在計算機中,聲明一個變量為,其實該數字作為二進制保存在計算機中,并不真的是。 前言 經常使用JavaScript用來處理數字的程序員都知道,JavaScript的Number.toFixed,這一函數,在格式化數字時,會自動進行四舍五入,例如: 1...
閱讀 1123·2021-11-24 09:39
閱讀 3623·2021-09-02 15:21
閱讀 2161·2021-08-24 10:01
閱讀 722·2021-08-19 10:55
閱讀 2447·2019-08-30 15:55
閱讀 1212·2019-08-30 14:16
閱讀 2992·2019-08-29 15:17
閱讀 3235·2019-08-29 13:53