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