IEEE754 浮點數(shù)詳解 - 深入 JavaScript 的 Number 類型

今天聊一點計算機的基礎(chǔ)——浮點數(shù),具體我們探討 IEEE754 格式的浮點數(shù),大多數(shù)語言都采用該格式來表示小數(shù)吹散,通常又分為單精度和雙精度浮點數(shù)造锅。

在 JavaScript 中皂贩,不區(qū)分整形和小數(shù),唯一表示數(shù)值的類型 Number 就是采用 IEEE754 格式中的雙精度浮點數(shù)來表示的会傲。

因為單精度和雙精度浮點數(shù)在原理上完全一致混卵,所以本文只集中分析雙精度浮點數(shù)。我會依次說一下原理恶阴、定義和一些結(jié)論诈胜。

原理

我們都知道任何一個數(shù)都可以用科學計數(shù)法,例如:

1.234 * 10 ^ 2    // => 123.4

其中冯事,^ 代表指數(shù)焦匈,下同。

同理昵仅,我們也可以不局限與 10 進制缓熟,采用任意進制 R,指數(shù)用 e 表示摔笤,m 表示基數(shù)够滑,正負數(shù)用 (-1) ^ S 表示,其中 S 為 0 或 1吕世,結(jié)果用 N 表示彰触,于是:

N = (-1) ^ S * m * R ^ e

這就是我們的原理,十分簡單寞冯。另外很容易得出渴析,對了任何非 0 的數(shù),m 都可以限定在大于等于 1 且小于 R 的范圍內(nèi)吮龄,即 [1, R)俭茧。當 R = 2 的時候,m 取值為 [1, 2)漓帚∧刚可以如下表示:

m = 1 + M     (0 <= M < 1)

定義

雙精度浮點數(shù)就是采用上面的原理,底數(shù) R = 2尝抖。

雙精度浮點數(shù)用 8 個字節(jié)表示毡们,也就是 64 bit。例如數(shù)值 100.25 在內(nèi)存中的情況如下:

0,10000000101,100100010~0 //  ~代表了若干個 0

為了分析昧辽,我將 64 bit 分為 3 個部分衙熔。

第一部分是符號位(S),占 1 bit搅荞,代表符號红氯,正數(shù) 0框咙,負數(shù)1。當前例子中痢甘,符號位為 0 表示這是一個正數(shù)喇嘱。

第三部分是尾數(shù)位(M),占 52 bit塞栅,代表基數(shù)的小數(shù)部分者铜,采用二進制表示。當前例子中 100100010~0 換算成十進制的小數(shù)為 1/2 + 1/16 + 1/256 = 0.56640625放椰。

第二部分是階碼位(E)作烟,占 11 bit,代表指數(shù)部分庄敛。

  • 因為基數(shù)始終是 1.xxx 的小數(shù)俗壹,所以為了表示 0,規(guī)定當階碼和尾碼全是 0 的時候藻烤,表示值 0 绷雏。因為前面還有符號位,所有有 +0 和 -0 之分怖亭。

  • 同時規(guī)定涎显,當階碼全為 1 ,尾碼全為0 的時候兴猩,表示 ∞期吓。同理,有 +∞ 和 -∞倾芝。

  • 因為 2^11 = 2048讨勤,排除上面兩種特殊情況,能表示的值為 1~2046晨另,但是為了表示小數(shù)潭千,我們指數(shù)需要用到負數(shù),因此我們設(shè)置一個偏碼值 1023借尿,指數(shù)的實際值 e = E - 1023刨晴,例如上面實例中 [10000000101]2 = 1029,因此實際的指數(shù)值 e = 6 = 1029 - 1023;

講解完畢路翻,關(guān)于浮點數(shù)的格式推導(dǎo)出真實值的公式也就如下:

(-1) ^ S * (1 + M) * 2 ^ (E - 1023) = N

對應(yīng)我們上面的示例:

(-1) ^ 0 * (1 + 0.56640625) * 2 ^ (1029 - 1023) = 1.56640625 * 2 ^ 6 = 100.25

是不是很簡單狈癞,沒看懂的童鞋還可以再看2遍。

結(jié)論

  • 指數(shù) e 的取值范圍為 (1-1023) ~ (2046 - 1023)茂契,也就是 -1022 ~ 1023蝶桶。

  • 基數(shù)的小數(shù)部分 M 的取數(shù)值范圍為 0 ~ (1 - 1 / (2 ^ 52)),大約是 0 ~ 1掉冶。
    意味著真竖,能表示數(shù)值的范圍是 -(1 + 1 - 1 / (2 ^ 52)) * 2 ^ 1023 ~ (1 + 1 - 1 / (2 ^ 52)) * 2 ^ 1023儡蔓,即 -1.79e+308 ~ 1.79e+308。其中最大值對應(yīng)的是 JavaScript 中的 Number.MAX_VALUE疼邀。

  • 當我們用上面的公式表示一個數(shù)的時候,一旦確定了指數(shù) e 召锈,同時也確定了在該指數(shù)下所表示值的最小精度旁振,即 2 ^ (e - 52)。因此雙精度浮點數(shù)能夠表示的最小精度為 2 ^ ( -1022 - 52) = 2 ^ -1074 = 5e-324涨岁,也就是我們 JavaScript 中 Number.MIN_Value 的值拐袜。同理,當我們要精確的表示一個整數(shù)時梢薪,也就是我們精度值要小于 1蹬铺,簡單倒推可得此時的 e<= 52,也就是說秉撇,當 e = 52 時我們依舊能夠精確的表示一個整數(shù)甜攀。因此 JavaScript 能夠精確表示一個整數(shù)的最大值為 (1 + (1 - 1 / (2 ^ 52))) * 2 ^ 52 = 2 ^ 53 - 1 = 9007199254740991,能精確表示一個整數(shù)的最小值自然就是 -9007199254740991琐馆,對應(yīng)我們 JavaScript 中的 Number. Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER规阀。

綜上,我們依次闡述了雙精度浮點數(shù)的原理瘦麸、定義和一些結(jié)論谁撼。而單精度浮點數(shù)只有在階碼和尾數(shù)的位數(shù)有所不同,原理完全一致滋饲,自然不用贅述厉碟。

最后,依舊是如果發(fā)現(xiàn)什么沒有闡述清楚或者有問題的地方屠缭,歡迎反饋箍鼓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市勿她,隨后出現(xiàn)的幾起案子袄秩,更是在濱河造成了極大的恐慌,老刑警劉巖逢并,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件之剧,死亡現(xiàn)場離奇詭異,居然都是意外死亡砍聊,警方通過查閱死者的電腦和手機背稼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玻蝌,“玉大人蟹肘,你說我怎么就攤上這事词疼。” “怎么了帘腹?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵贰盗,是天一觀的道長。 經(jīng)常有香客問我阳欲,道長舵盈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任球化,我火速辦了婚禮秽晚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筒愚。我一直安慰自己赴蝇,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布巢掺。 她就那樣靜靜地躺著句伶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪址遇。 梳的紋絲不亂的頭發(fā)上熄阻,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音倔约,去河邊找鬼秃殉。 笑死,一個胖子當著我的面吹牛浸剩,可吹牛的內(nèi)容都是我干的钾军。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼绢要,長吁一口氣:“原來是場噩夢啊……” “哼吏恭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起重罪,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤樱哼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后剿配,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搅幅,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年呼胚,在試婚紗的時候發(fā)現(xiàn)自己被綠了茄唐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝇更,死狀恐怖沪编,靈堂內(nèi)的尸體忽然破棺而出呼盆,到底是詐尸還是另有隱情,我是刑警寧澤蚁廓,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布访圃,位于F島的核電站,受9級特大地震影響相嵌,放射性物質(zhì)發(fā)生泄漏挽荠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一平绩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漠另,春花似錦捏雌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至满败,卻和暖如春肤频,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背算墨。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工宵荒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人净嘀。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓报咳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挖藏。 傳聞我的和親對象是個殘疾皇子暑刃,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容