亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

BigTomato / 980人閱讀

摘要:類型使用的就是標準中的雙精度浮點數(shù)。數(shù)字的許多特性都依賴于此標準,例如令人費解的不等于這篇文章介紹標準中雙精度浮點數(shù)二進制儲存格式,并由此推出中數(shù)字的一些特性。

Javascript 作為一門動態(tài)語言,其數(shù)字類型只有 number 一種。 nubmer 類型使用的就是 IEEE754 標準中的 雙精度浮點數(shù)。Javascript 數(shù)字的許多特性都依賴于此標準,例如令人費解的 0.1+0.2不等于0.3

這篇文章介紹 IEEE754 標準中雙精度浮點數(shù)二進制儲存格式,并由此推出 js 中數(shù)字的一些特性。

一、IEEE754 中浮點數(shù)的儲存格式

在 IEEE754 中,雙精度浮點數(shù)儲存為64位:

指數(shù)位可以通過下面的方法轉(zhuǎn)換為使用的指數(shù)值:

浮點數(shù)表示的值的形式由 $e$ 和 $f$ 確定:

二、根據(jù) IEEE754 計算 0.1+0.2 1. 將 0.1 使用轉(zhuǎ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$ 僅儲存 52bit, 儲存時會將超出精度部分進行"零舍一入"

值類型 小數(shù)位(儲存范圍內(nèi)) 小數(shù)位(儲存范圍外)
無限精確值 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001...
實際儲存值 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 -

由于計算加減時不會對指數(shù)位進行位運算,這里不計算指數(shù)位的表示,直接使用數(shù)字表示最終的指數(shù)值

0.1、0.2 的表示如下:

浮點數(shù)數(shù)值 符號位 $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 相加

在計算浮點數(shù)相加時需要先進行“對位”,將較小的指數(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$

可以通過下面的方法檢驗計算結(jié)果是否于 js 中一致:

0.1 + 0.2 === (-1)**0 * 2**-2 * (0b10011001100110011001100110011001100110011001100110100 * 2**-52)
//> true
//計算正確
三、計算 javascript Number 的特性

在js中 Number對象上附帶了許多屬性,表示可數(shù)的范圍等信息,例如 Number.MAX_SAFE_INTEGER 是一個16位的數(shù)字,這一部分將解釋如何計算出這些有特殊意義的數(shù)字。

1.計算 Number.MAX_VALUENumber.MIN_VALUE

當符號位為0、指數(shù)取到1023、小數(shù)位全為1時,為可表示的最大值
當符號位為0、指數(shù)位全為0(表示非規(guī)格浮點數(shù))、小數(shù)位僅最后一位為1時,為可表示的最小正值

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.計算 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,這讓每個小數(shù)位都表示浮點數(shù)的整數(shù)部分,小數(shù)位最低位對應(yīng) $2^0$,然后將每個小數(shù)位都置1,可得最大準確整數(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
//當它 +1 時,可由 (-1)**0 * 2**53 * (Number.parseInt("1"+"0".repeat(52),2) * 2**-52) 正確表示,而再 +1 時則無法準確表示

//符號位取反可得最小安全整數(shù)
-1 * max_safe_int === Number.MIN_SAFE_INTEGER;
3.計算 Number.EPSILON

Number.EPSILON 是一個極小值,用于檢測計算結(jié)果是否在誤差范圍內(nèi)。例如:

Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON;
//> true

//2017-9-27 補充
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ù)此計算出 Number.EPSILON 的值:

//將表示1的二進制小數(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/81417.html

相關(guān)文章

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

    摘要:而的浮點數(shù)設(shè)置的偏移值是,因為指數(shù)域表現(xiàn)為一個非負數(shù),位,所以,實際的,所以。這是因為它們在轉(zhuǎn)為二進制時要舍入部分的不同可能造成的不同舍 IEEE 754 表示:你盡管抓狂、罵娘,但你能完全避開我,算我輸。 一、IEEE-754浮點數(shù)捅出的那些婁子 首先我們還是來看幾個簡單的問題,能說出每一個問題的細節(jié)的話就可以跳過了,而如果只能泛泛說一句因為IEEE754浮點數(shù)精度問題,那么下文還是...

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

    摘要:數(shù)字數(shù)字都是浮點數(shù),按照標準進行存儲。因此,只有偶數(shù)可以在范圍內(nèi)表示。但只有超過指數(shù)的上限才稱為中的溢出。結(jié)論在這篇博文中,我們研究了如何將其浮點數(shù)轉(zhuǎn)換為位。 JavaScript中的所有數(shù)字都是浮點數(shù)。這篇博客文章解釋了這些浮點數(shù)如何在64位二進制內(nèi)部表示。由于特別考慮,本文中的數(shù)字將用整數(shù)表示,以便在閱讀本文后,您將了解在以下交互中會發(fā)生什么: (譯者注:浮點數(shù)并不一定等于小數(shù),定...

    Moxmi 評論0 收藏0
  • 深度剖析0.1 +0.2===0.30000000000000004原因

    摘要:吐槽一句,大二的專業(yè)課數(shù)字邏輯電路終于用在工作上了。,整數(shù)位為,且精度只到十分位,因此是。如果是不限精度的話,轉(zhuǎn)換后的二進制數(shù)應(yīng)該是無限循環(huán)。再看一下百科給出的標準因此,的類型,最高的位是符號位,接著的位是指數(shù),剩下的位為有效數(shù)字。 showImg(https://segmentfault.com/img/remote/1460000011902479?w=600&h=600); 用一...

    haobowd 評論0 收藏0
  • JS-Number—了解IEEE雙精度點數(shù)

    摘要:一復(fù)習(xí)進制轉(zhuǎn)進制整數(shù)部分除取余,逆序小數(shù)部分乘取整,正序在線工具二了解雙精度浮點數(shù)規(guī)范通過進制的科學(xué)計數(shù)法存儲。最終可表示為圖片來源其中,,都是實際存儲科學(xué)計數(shù)法的值。 一、復(fù)習(xí)10進制轉(zhuǎn)2進制 1)整數(shù)部分:除2取余,逆序2)小數(shù)部分:乘2取整,正序在線工具 二、了解IEEE 754雙精度浮點數(shù)規(guī)范 1) 通過2進制的科學(xué)計數(shù)法存儲。 和10進制的科學(xué)計數(shù)法類似,二進制的科學(xué)技術(shù)法格...

    shixinzhang 評論0 收藏0
  • JavaScript四舍五入那些坑

    摘要:進制之謎眾所周知,計算機在設(shè)計之初,出于各方面角度考慮,最終采用二進制的格式來存儲數(shù)據(jù)。同樣的情況,也會出現(xiàn)在十進制和二進制的轉(zhuǎn)換中。當我們在計算機中,聲明一個變量為,其實該數(shù)字作為二進制保存在計算機中,并不真的是。 前言 經(jīng)常使用JavaScript用來處理數(shù)字的程序員都知道,JavaScript的Number.toFixed,這一函數(shù),在格式化數(shù)字時,會自動進行四舍五入,例如: 1...

    zollero 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<