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