摘要:中數字存儲使用的是位雙精度浮點數在計算機中存儲為位符號位正數負數指數位用來確定范圍尾數位用來確定精度轉成十進制表示法為符號位指數位尾數位偏正值使得指數位真實取值為而非目的是為了方便比較大小實際指數值階碼偏正值階碼指數的移碼移碼與補
Javascript中數字存儲使用的是IEEE754 64位雙精度浮點數
在計算機中存儲為64位
1 11 52
1: 符號位 0正數 1負數
11: 指數位 用來確定范圍
52: 尾數位 用來確定精度
轉成十進制表示法為
num = (-1)^s * (1.f) * 2^E E = e - 1023 s:符號位 e:指數位 f:尾數位 1023偏正值 使得指數位真實取值為[-1023, 1024] 而非 [0, 2047] 目的是為了方便比較大小 實際指數值 = 階碼 - 偏正值 階碼 = 指數的移碼 - 1 移碼與補碼符號為互為取反 舉例: 如果指數位實際值為-1 原碼:100 0000 0001 反碼:111 1111 1110 補碼:111 1111 1111 移碼:011 1111 1111 階碼:011 1111 1110 = 1022 也可以通過 階碼 = 指數 + 偏正值 = -1 + 1023 = 1022 = 011 1111 1110來計算得到
指數位全0和全1有特殊含義,在后面會講到,用來表示+-0 和 +-∞
特殊值
機器精度
del = 2^-52
接下來解釋一下為什么在使用IEEE754標準的語言中0.1 + 0.2 = 0.30000000000000004
首先我們計算下0.1的二進制
0.1 * 2 = 0
0.2 * 2 = 0
0.4 * 2 = 0
0.8 * 2 = 1
0.6 * 2 = 1
0.2 * 2 = 0
0.4 * 2 = 0
0.8 * 2 = 1
0.6 * 2 = 1
0.2 * 2 = 0
....
所以0.1的二進制為 0.0001100110011001100...循環,
可以轉換為2^-4 * 1.100110011001100...
由于保留位數共52位,不包括最左邊整數位1,
所以最終在計算機中存儲的數值是:2^-4 * 1.100 11001100 11001100 11001100 11001100 11001100 11001100 1
同理0.2
0.2 * 2 = 0
0.4 * 2 = 0
0.8 * 2 = 1
0.6 * 2 = 1
0.2 * 2 = 0
0.4 * 2 = 0
0.8 * 2 = 1
0.6 * 2 = 1
...
所以0.2的二進制為 0.001100110011001100...循環,
可以轉換為2^-3 * 1.100110011001100...
最易最終在計算機中存儲的數值是:2^-3 * 1.100 11001100 11001100 11001100 11001100 11001100 11001100 1
兩者相加
0.0001100 11001100 11001100 11001100 11001100 11001100 11001100 1
+
0.001100 11001100 11001100 11001100 11001100 11001100 11001100 1
= 0.0 10011001 10011001 10011001 10011001 10011001 10011001 10011
≈ 0.30000000000000004
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107565.html
摘要:按照的數字格式,整數有的范圍是,而且只能表示有限個浮點數,能表示的個數為個。 0.1+0.2 等于0.3嗎?相信拿著這條題目隨便問一個高年級的小學生,他們都會毫不猶豫都回答:相等。是的,相等是正常的,這是常識。但是都說實踐是檢驗真理的唯一標準,拿這道簡單的算術題用javascript在chrome控制臺試驗一下: 結果令人大跌眼鏡,在控制臺輸入0.1+0.2 == 0.3返回的結果竟然...
摘要:又如,對于,結果其實并不是,但是最接近真實結果的數,比其它任何浮點數都更接近。許多語言也就直接顯示結果為了,而不展示一個浮點數的真實結果了。小結本文主要介紹了浮點數計算問題,簡單回答了為什么以及怎么辦兩個問題為什么不等于。 原文地址:為什么0.1+0.2不等于0.3 先看兩個簡單但詭異的代碼: 0.1 + 0.2 > 0.3 // true 0.1 * 0.1 = 0.01000000...
摘要:方法使用定點表示法來格式化一個數,會對結果進行四舍五入。該數值在必要時進行四舍五入,另外在必要時會用來填充小數部分,以便小數部分有指定的位數。如果數值大于,該方法會簡單調用并返回一個指數記數法格式的字符串。在環境中,只能是之間,測試版本為。 showImg(https://segmentfault.com/img/remote/1460000011913134?w=768&h=521)...
摘要:標準是浮點數算術標準的標準編號,等同于國際標準。標準規定了計算機程序設計環境中的二進制和十進制的浮點數之間的交換算術格式以及方法。 初學JavaScript,在進行小數(浮點數)運算時,經常會碰到這樣的情況:0.1 + 0.2=0.30000000000000004,記得當時,教程告訴我們說,0.1 + 0.2在JavaScript運算中,它的值是不固定的,可以在后面學習和試驗中,漸漸...
摘要:的二進制科學計數法第位是,所以就有了下面的結果有著同樣的問題,其實正是由于這樣的存儲,在這里有了精度丟失,導致了。最大安全數字中表示最大安全數字計算結果是,即在這個數范圍內不會出現精度丟失小數除外這個數實際上是。是一個任意精度的整數。 話不多說,先上代碼 function judgeFloat(n, m) { const binaryN = n.toString(2...
閱讀 1446·2021-11-16 11:44
閱讀 3286·2021-09-29 09:43
閱讀 620·2019-08-30 10:52
閱讀 938·2019-08-29 11:01
閱讀 3259·2019-08-26 11:47
閱讀 2886·2019-08-23 12:18
閱讀 1359·2019-08-22 17:04
閱讀 2046·2019-08-21 17:04