摘要:一復習進制轉進制整數部分除取余,逆序小數部分乘取整,正序在線工具二了解雙精度浮點數規范通過進制的科學計數法存儲。最終可表示為圖片來源其中,,都是實際存儲科學計數法的值。
一、復習10進制轉2進制
1)整數部分:除2取余,逆序
2)小數部分:乘2取整,正序
在線工具
和10進制的科學計數法類似,二進制的科學技術法格式為1.xxx*2^N。其中需要留意下二進制科學計數法的整數部分都是1,所以在存儲時省略整數部分1。
2) 格式:符號位+指數位+尾數位符號位S:第 1 位是正負數符號位(sign),0代表正數,1代表負數
指數位E:中間的 11 位存儲指數(exponent),用來表示次方數
科學計數法中指數E是可以為負數的,在表示負的指數時IEEE754標準引入了一個偏移量1023,在存儲指數時加上該偏移量把負數E轉成正數。這就導致11位的指數能夠表示指數的范圍是[-1023, 1024]。
尾數位M:最后的 52 位是尾數(mantissa),超出的部分自動進一舍零,沒有填滿的部分自動補0
如10進制數400.12,用10進制科學計數法表示為:4.0012*10^2,。其中"0012"就是尾數部分。
最終可表示為(圖片來源):
其中S,E,M都是實際存儲科學計數法的值。
如10進制4.5轉成2進制為:
// Step1 轉成二進制 100.1 // Step2 轉成二進制科學計數 1.001*2^2 S = 0 E = 2 + 1023 = 2015 M = 001 // 整數1被省略了
形象的查看存儲情況,可參考這里
3) 有限集合IEEE754能表示的實數數量是有限的,假設MAX_VALUE,MIN_VALUE分別表示其表示的最大正數和最小正數,那有限集合可表示為:
[-MAX_VALUE, -MIN_VALUE] U [MIN_VALUE, -MAX_VALUE]幾個有趣的問題 1) 0.1 + 0.2 !== 0.3
0.1,0.2和0.3在轉成二進制時都是無限循環的,在存儲時會失去精度,0.1+0.2在運算時也會失去精度,導致結果不等于0.3。
2) 給一個數字加上一個非0的增量還等于本身這個數字1 + Number.MIN_VALUE/2 === 1
這個增量如果小于JS能表示的最小浮點數就會視為0,加上這樣的數等于加上0。
3) JS最大整數為啥是2^53-1而不是2^52-1尾數占用52個bit,再加速省略的那個bit(見2.1)正好53個bit。
4)JS可以精確的表示哪些小數呢小數部分是這種格式的都可以精確表示。
1/Math.pow(2, N), 其中N是(0, 1024)區間的整數。
如分數1/2,1/4, 1/8。
參考抓住數據的小尾巴 - JS浮點數陷阱及解法
該死的IEEE-754浮點數,說「約」就「約」,你的底線呢?以JS的名義來好好查查你
IEEE 754 計算器
IEEE 754 二進制表示
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107293.html
摘要:推導為何等于在中所有數值都以標準的雙精度浮點數進行存儲的。先來了解下標準下的雙精度浮點數。精度位總共是,因為用科學計數法表示,所以首位固定的就沒有占用空間。驗證完成的最大安全數是如何來的根據雙精度浮點數的構成,精度位數是。 閱讀完本文可以了解到 0.1 + 0.2 為什么等于 0.30000000000000004 以及 JavaScript 中最大安全數是如何來的。 十進制小數轉為二...
摘要:而的浮點數設置的偏移值是,因為指數域表現為一個非負數,位,所以,實際的,所以。這是因為它們在轉為二進制時要舍入部分的不同可能造成的不同舍 IEEE 754 表示:你盡管抓狂、罵娘,但你能完全避開我,算我輸。 一、IEEE-754浮點數捅出的那些婁子 首先我們還是來看幾個簡單的問題,能說出每一個問題的細節的話就可以跳過了,而如果只能泛泛說一句因為IEEE754浮點數精度問題,那么下文還是...
摘要:類型使用的就是標準中的雙精度浮點數。數字的許多特性都依賴于此標準,例如令人費解的不等于這篇文章介紹標準中雙精度浮點數二進制儲存格式,并由此推出中數字的一些特性。 Javascript 作為一門動態語言,其數字類型只有 number 一種。 nubmer 類型使用的就是 IEEE754 標準中的 雙精度浮點數。Javascript 數字的許多特性都依賴于此標準,例如令人費解的 0.1+0...
摘要:如題先陳述下問題背景偶爾測測自己寫的計算器,隨便輸入玩嘛,然后發生下面詭異的事情當我從一個輸入到十個的時候,過程顯示都是正確的,像這樣繼續輸入一個的時候,然后就這個樣子了什么原因呢看了下自己的代碼,代碼重要部分長這樣的這里用了一下強制轉化為 如題 先陳述下問題背景 偶爾測測自己寫的計算器,隨便輸入玩嘛,然后發生下面詭異的事情:當我從一個 1 輸入到十個 1 的時候,過程顯示都是正確的...
摘要:數字數字都是浮點數,按照標準進行存儲。因此,只有偶數可以在范圍內表示。但只有超過指數的上限才稱為中的溢出。結論在這篇博文中,我們研究了如何將其浮點數轉換為位。 JavaScript中的所有數字都是浮點數。這篇博客文章解釋了這些浮點數如何在64位二進制內部表示。由于特別考慮,本文中的數字將用整數表示,以便在閱讀本文后,您將了解在以下交互中會發生什么: (譯者注:浮點數并不一定等于小數,定...
閱讀 960·2021-11-24 09:39
閱讀 3383·2021-10-27 14:20
閱讀 2322·2019-08-30 14:08
閱讀 3360·2019-08-29 16:34
閱讀 2175·2019-08-26 12:14
閱讀 2104·2019-08-26 11:54
閱讀 2771·2019-08-26 11:44
閱讀 2474·2019-08-26 11:38