摘要:例如指數(shù)實(shí)際值為,在單精度浮點(diǎn)數(shù)中的指數(shù)域編碼值為,即采用指數(shù)的實(shí)際值加上固定的偏移值的辦法表示浮點(diǎn)數(shù)的指數(shù),好處是可以用長(zhǎng)度為個(gè)比特的無(wú)符號(hào)整數(shù)來(lái)表示所有的指數(shù)取值,這使得兩個(gè)浮點(diǎn)數(shù)的指數(shù)大小的比較更為容易。
自己整理、設(shè)計(jì)的,轉(zhuǎn)載請(qǐng)注明原帖。先從這個(gè)demo看起:http://alvarto.github.io/Visu...
數(shù)軸 說(shuō)明關(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)存模型參考國(guó)際標(biāo)準(zhǔn)IEEE 754,我畫了一張圖幫助理解:
注,這里的字符是從左到右排的,和wiki之類的資料順序相反。wiki資料考慮的是比較的順序(符號(hào)-指數(shù)位-有效數(shù)字),而我這里考慮到的是閱讀順序(從0到63位,從左到右)。
中間的指數(shù)位是如何同時(shí)表示正負(fù)指數(shù)值的呢,和“符號(hào)位+有效數(shù)字位”的常規(guī)表示方法不同,指數(shù)是使用偏移法來(lái)做的:
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ù)的比特的長(zhǎng)度。
以單精度浮點(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ù),好處是可以用長(zhǎng)度為e個(gè)比特的無(wú)符號(hào)整數(shù)來(lái)表示所有的指數(shù)取值,這使得兩個(gè)浮點(diǎn)數(shù)的指數(shù)大小的比較更為容易。
因此,在JavaScript里面的指數(shù)位,是從1-2^(11-1),也就是從-1023開(kāi)始,表示了(-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位開(kāi)始,第一個(gè)進(jìn)制被舍棄,這個(gè)時(shí)候,2^53+1==2^53,每?jī)蓚€(gè)值都會(huì)有一個(gè)值出現(xiàn)這種不精確的情形。再過(guò)N個(gè)值,會(huì)出現(xiàn)每4個(gè)值里面都有3個(gè)值不精確;再過(guò)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的維基頁(yè)面,還有這篇文章,解釋的非常清晰:"How numbers are encoded in JavaScript"
最后再推一次:輸入表達(dá)式,返回對(duì)應(yīng)Number值的內(nèi)存模型的DEMO
http://alvarto.github.io/Visu...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87479.html
摘要:?jiǎn)栴}引入接觸過(guò)事件循環(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)輸出嵌套的。 問(wèn)題引入 接觸過(guò)事件循環(huán)的同學(xué)大都會(huì)糾結(jié)一個(gè)點(diǎn),就是在Node中setTimeout和setImmediate執(zhí)行順序的隨機(jī)性。 比如說(shuō)下面這段代碼: setTimeout(() => { ...
摘要:將大的先放在后面,再下一次可以把相同大的放在上一次的之前,順序改變。 之前介紹的排序算法: 【算法】插入排序——希爾排序+直接插入排序_Rinne’s blog-C...
摘要:實(shí)際上這個(gè)情形中存在冪定律實(shí)際上絕大多數(shù)的計(jì)算機(jī)算法的運(yùn)行時(shí)間滿足冪定律?;谘芯康弥?,原則上我們能夠獲得算法,程序或者操作的性能的精確數(shù)學(xué)模型。 前言 上一篇:并查集下一篇:棧和隊(duì)列 在算法性能上我們常常面臨的挑戰(zhàn)是我們的程序能否求解實(shí)際中的大型輸入:--為什么程序運(yùn)行的慢?--為什么程序耗盡了內(nèi)存? 沒(méi)有理解算法的性能特征會(huì)導(dǎo)致客戶端的性能很差,為了避免這種情況的出線,需要具備算法...
我們?cè)趯W(xué)習(xí)javascript時(shí),經(jīng)常會(huì)聽(tīng)到萬(wàn)物皆對(duì)象,但是呢,其實(shí)萬(wàn)物皆對(duì)象的對(duì)象也有區(qū)別。分為普通對(duì)象和函數(shù)對(duì)象。1.對(duì)象分為函數(shù)對(duì)象和普通對(duì)象? ??通過(guò)new Function()創(chuàng)建的對(duì)象都是函數(shù)對(duì)象,其他的都是普通對(duì)象。showImg(https://segmentfault.com/img/bVbtWre?w=526&h=252); 2.構(gòu)造函數(shù)而提到new關(guān)鍵字,我們不得不提到構(gòu)造...
一、HTML5與HTML4 1.1 推出的理由和目標(biāo) H5的出現(xiàn),對(duì)于Web來(lái)說(shuō)意義重大。因?yàn)樗囊鈭D是想要把目前Web上存在的各種問(wèn)題一并解決掉。 Web瀏覽器之間的兼容性很低 文檔結(jié)構(gòu)不夠明確(增加了很多結(jié)構(gòu), 語(yǔ)義化的標(biāo)簽) Web應(yīng)用程序的功能受到了限制 H5 的出現(xiàn)極大的解決了上面的問(wèn)題 1.2 語(yǔ)法的改變 1.2.1 DOCTYPE聲明 H5 DOCTYPE的聲明是這樣的: ...
閱讀 1878·2019-08-29 16:44
閱讀 2181·2019-08-29 16:30
閱讀 791·2019-08-29 15:12
閱讀 3534·2019-08-26 10:48
閱讀 2667·2019-08-23 18:33
閱讀 3788·2019-08-23 17:01
閱讀 1948·2019-08-23 15:54
閱讀 1311·2019-08-23 15:05