摘要:例如指數(shù)實(shí)際值為,在單精度浮點(diǎn)數(shù)中的指數(shù)域編碼值為,即采用指數(shù)的實(shí)際值加上固定的偏移值的辦法表示浮點(diǎn)數(shù)的指數(shù),好處是可以用長度為個(gè)比特的無符號(hào)整數(shù)來表示所有的指數(shù)取值,這使得兩個(gè)浮點(diǎn)數(shù)的指數(shù)大小的比較更為容易。
自己整理、設(shè)計(jì)的,轉(zhuǎn)載請注明原帖。先從這個(gè)demo看起:http://alvarto.github.io/Visu...
數(shù)軸 說明關(guān)于Number.MAX_VALUE和Number.MIN_VALUE:這個(gè)結(jié)果為了好看被我四舍五入了……
關(guān)于±0:紫云飛:JavaScript中的兩個(gè)0
關(guān)于數(shù)組的最大索引:紫云飛:JavaScript:數(shù)組能越界?
關(guān)于JavaScript可以精確表示到個(gè)位的最大整數(shù):阮一峰:JavaScript數(shù)值
關(guān)于Number表示的內(nèi)存模型參考國際標(biāo)準(zhǔn)IEEE 754,我畫了一張圖幫助理解:
注,這里的字符是從左到右排的,和wiki之類的資料順序相反。wiki資料考慮的是比較的順序(符號(hào)-指數(shù)位-有效數(shù)字),而我這里考慮到的是閱讀順序(從0到63位,從左到右)。
中間的指數(shù)位是如何同時(shí)表示正負(fù)指數(shù)值的呢,和“符號(hào)位+有效數(shù)字位”的常規(guī)表示方法不同,指數(shù)是使用偏移法來做的:
IEEE 754:指數(shù)偏移值
指數(shù)偏移值(exponent bias),是指浮點(diǎn)數(shù)表示法中的指數(shù)域的編碼值為指數(shù)的實(shí)際值加上某個(gè)固定的值,IEEE 754標(biāo)準(zhǔn)規(guī)定該固定值為2^(e-1)-1,其中的e為存儲(chǔ)指數(shù)的比特的長度。
以單精度浮點(diǎn)數(shù)為例,它的指數(shù)域是8個(gè)比特,固定偏移值是28-1 - 1 = 128?1 = 127.單精度浮點(diǎn)數(shù)的指數(shù)部分實(shí)際取值是從128到-127。例如指數(shù)實(shí)際值為1710,在單精度浮點(diǎn)數(shù)中的指數(shù)域編碼值為14410,即14410 = 1710 + 12710.
采用指數(shù)的實(shí)際值加上固定的偏移值的辦法表示浮點(diǎn)數(shù)的指數(shù),好處是可以用長度為e個(gè)比特的無符號(hào)整數(shù)來表示所有的指數(shù)取值,這使得兩個(gè)浮點(diǎn)數(shù)的指數(shù)大小的比較更為容易。
因此,在JavaScript里面的指數(shù)位,是從1-2^(11-1),也就是從-1023開始,表示了(-1023,1024)這個(gè)區(qū)間。
實(shí)際指數(shù)值 | 存儲(chǔ)的指數(shù)值 |
-1022 | 1 |
0 | 1023 |
1023 | 2046 |
Number保留了指數(shù)值0和2047用于表示一些特殊的值??偟谋硎颈砀袢缦拢?/p>
X | Y | 表示的值 |
=0 | =0 | ±0 |
≠0 | =2047 | NaN |
=0 | =2047 | ±Infinity |
≠0 | =0 | 反規(guī)格化值(Denormalized):f(0.x , 1 , z) |
∈(0,2047) | 規(guī)格化值(Normalized):f(1.x , y , z) | |
f(i,j,k) = (-1)k · 2-1023+j · i |
前52位能表示的最大值是下面這個(gè)(下面是52位+1位默認(rèn)的1):
parseInt("11111111111111111111111111111111111111111111111111111",2) -> 9007199254740991 //即2^53-1
而下一個(gè)值是:
parseInt("100000000000000000000000000000000000000000000000000000",2) -> 9007199254740992 //即2^53
根據(jù)內(nèi)存模型,畫一張圖就可以知道:
從第2^53位開始,第一個(gè)進(jìn)制被舍棄,這個(gè)時(shí)候,2^53+1==2^53,每兩個(gè)值都會(huì)有一個(gè)值出現(xiàn)這種不精確的情形。再過N個(gè)值,會(huì)出現(xiàn)每4個(gè)值里面都有3個(gè)值不精確;再過M個(gè)值,會(huì)出現(xiàn)每2^K個(gè)值里有2^K-1個(gè)值不精確;以此類推……(小題目:這個(gè)N值是多少?)
最大可表示的正數(shù)驗(yàn)證:
Number.MAX_VALUE.toString(2) -> "1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" var a = Number.MAX_VALUE.toString(2).split("") , b = [ a.filter(function(i){return i==0}).length , a.filter(function(i){return i==1}).length ] ; b -> [971, 53] Number.MAX_VALUE === (Math.pow(2,53)-1)*Math.pow(2,971) -> true
QED
最小可表示的正數(shù)還記得前面的表格嗎:
X | Y | 表示的值 |
≠0 | =0 | 反規(guī)格化值(Denormalized):f(0.x , 1 , z) |
∈(0,2047) | 規(guī)格化值(Normalized):f(1.x , y , z) | |
f(i,j,k) = (-1)k · 2-1023+j · i |
非規(guī)格化值是這樣表示的:
最小正數(shù)的內(nèi)存模型
驗(yàn)證:
Number.MIN_VALUE.toString(2) -> "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" var a = Number.MIN_VALUE.toString(2).split(""); a.filter(function(i){return i==0}).length - 1 -> 1073 Number.MIN_VALUE === Math.pow(2,-1074) -> true參考資料
除了IEEE 754的維基頁面,還有這篇文章,解釋的非常清晰:"How numbers are encoded in JavaScript"
最后再推一次:輸入表達(dá)式,返回對應(yīng)Number值的內(nèi)存模型的DEMO
http://alvarto.github.io/Visu...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/87479.html
摘要:問題引入接觸過事件循環(huán)的同學(xué)大都會(huì)糾結(jié)一個(gè)點(diǎn),就是在中和執(zhí)行順序的隨機(jī)性。當(dāng)隊(duì)列被執(zhí)行完,或者執(zhí)行的回調(diào)數(shù)量達(dá)到上限后,事件循環(huán)才會(huì)進(jìn)入下一個(gè)階段。嵌套的在下一個(gè)事件循環(huán)的階段執(zhí)行回調(diào)輸出嵌套的。 問題引入 接觸過事件循環(huán)的同學(xué)大都會(huì)糾結(jié)一個(gè)點(diǎn),就是在Node中setTimeout和setImmediate執(zhí)行順序的隨機(jī)性。 比如說下面這段代碼: setTimeout(() => { ...
摘要:將大的先放在后面,再下一次可以把相同大的放在上一次的之前,順序改變。 之前介紹的排序算法: 【算法】插入排序——希爾排序+直接插入排序_Rinne’s blog-C...
摘要:實(shí)際上這個(gè)情形中存在冪定律實(shí)際上絕大多數(shù)的計(jì)算機(jī)算法的運(yùn)行時(shí)間滿足冪定律?;谘芯康弥?,原則上我們能夠獲得算法,程序或者操作的性能的精確數(shù)學(xué)模型。 前言 上一篇:并查集下一篇:棧和隊(duì)列 在算法性能上我們常常面臨的挑戰(zhàn)是我們的程序能否求解實(shí)際中的大型輸入:--為什么程序運(yùn)行的慢?--為什么程序耗盡了內(nèi)存? 沒有理解算法的性能特征會(huì)導(dǎo)致客戶端的性能很差,為了避免這種情況的出線,需要具備算法...
我們在學(xué)習(xí)javascript時(shí),經(jīng)常會(huì)聽到萬物皆對象,但是呢,其實(shí)萬物皆對象的對象也有區(qū)別。分為普通對象和函數(shù)對象。1.對象分為函數(shù)對象和普通對象? ??通過new Function()創(chuàng)建的對象都是函數(shù)對象,其他的都是普通對象。showImg(https://segmentfault.com/img/bVbtWre?w=526&h=252); 2.構(gòu)造函數(shù)而提到new關(guān)鍵字,我們不得不提到構(gòu)造...
閱讀 1938·2019-08-29 16:44
閱讀 2232·2019-08-29 16:30
閱讀 865·2019-08-29 15:12
閱讀 3596·2019-08-26 10:48
閱讀 2715·2019-08-23 18:33
閱讀 3852·2019-08-23 17:01
閱讀 2007·2019-08-23 15:54
閱讀 1357·2019-08-23 15:05