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

資訊專欄INFORMATION COLUMN

IEEE754 浮點(diǎn)數(shù)格式 與 Javascript number 的特性

BigTomato / 963人閱讀

摘要:類型使用的就是標(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$ 確定:

二、根據(jù) IEEE754 計(jì)算 0.1+0.2 1. 將 0.1 使用轉(zhuǎn)換為二進(jìn)制

$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
2. 將 0.1 與 0.2 相加

在計(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_VALUENumber.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;
//> true
2.計(jì)算 Number.MAX_SAFE_INTEGERNumber.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

相關(guān)文章

  • 該死IEEE-754點(diǎn)數(shù),說「約」就「約」,你底線呢?以JS名義來好好查查你

    摘要:而的浮點(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ù)精度問題,那么下文還是...

    gaosboy 評(píng)論0 收藏0
  • 數(shù)字在JavaScript中是如何編譯

    摘要:數(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ù),定...

    Moxmi 評(píng)論0 收藏0
  • 深度剖析0.1 +0.2===0.30000000000000004原因

    摘要:吐槽一句,大二的專業(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); 用一...

    haobowd 評(píng)論0 收藏0
  • JS-Number—了解IEEE雙精度點(diǎn)數(shù)

    摘要:一復(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ù)法格...

    shixinzhang 評(píng)論0 收藏0
  • JavaScript四舍五入那些坑

    摘要:進(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...

    zollero 評(píng)論0 收藏0

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

0條評(píng)論

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