成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

圖解:JavaScript中Number的一些表示上/下限

SillyMonkey / 2169人閱讀

摘要:例如指數(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_VALUENumber.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

精確表示到個(gè)位的最大整數(shù)

前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

相關(guān)文章

  • 由setTimeout和setImmediate執(zhí)行順序隨機(jī)性窺探Node事件循環(huán)機(jī)制

    摘要:?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(() => { ...

    marek 評(píng)論0 收藏0
  • 【算法】計(jì)數(shù)排序 + 各個(gè)排序算法穩(wěn)定性

    摘要:將大的先放在后面,再下一次可以把相同大的放在上一次的之前,順序改變。 之前介紹的排序算法: 【算法】插入排序——希爾排序+直接插入排序_Rinne’s blog-C...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • 算法分析 - Algorithms, Part I, week 1 ANALYSIS OF ALGO

    摘要:實(shí)際上這個(gè)情形中存在冪定律實(shí)際上絕大多數(shù)的計(jì)算機(jī)算法的運(yùn)行時(shí)間滿足冪定律?;谘芯康弥?,原則上我們能夠獲得算法,程序或者操作的性能的精確數(shù)學(xué)模型。 前言 上一篇:并查集下一篇:棧和隊(duì)列 在算法性能上我們常常面臨的挑戰(zhàn)是我們的程序能否求解實(shí)際中的大型輸入:--為什么程序運(yùn)行的慢?--為什么程序耗盡了內(nèi)存? 沒(méi)有理解算法的性能特征會(huì)導(dǎo)致客戶端的性能很差,為了避免這種情況的出線,需要具備算法...

    Leo_chen 評(píng)論0 收藏0
  • 圖解javascript原型&原型鏈

    我們?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)造...

    sutaking 評(píng)論0 收藏0
  • HTML5 新特性

    一、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的聲明是這樣的: ...

    王偉廷 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<