摘要:當階碼全位,尾數全為時,采取非規格化,兩者不包含隱含的,用來表示。最簡單的精度算法就是是位十進制,所以位肯定能精確處理。當然還有很多,有興趣可以自行查閱一下。
掘金搬來思否浮點數的存儲格式:IEEE754-64bit 64位組成格式為:S(1位符號位) E(11位階碼)M(52位尾數)
符號位:決定正負,0位正,1位負
階碼:指數位則為階碼-1023,決定了數值的大小
尾數:有效數字,決定了精度
用科學計數法格式則為:(-1^(符號位0/1)) 1.xxxxx(尾數位) 2^(指數位)
需要記住的IEEE754規范有:尾數位:有效數字的第一位必定是1,所以這個1不會被儲存,也就是說實際上尾數位52+1,類似1.xxx第一位就是1。
階碼:不存在負值,那怎么表示負指數呢?就是減去一個固定值;其值就是1023,也就是偏移量1023;除去全是1和全是0的情況,那么指數位的范圍則是[(1-1023),(2046-1023)] == [-1022,1023]。
當階碼全位0,尾數全為0時,采取非規格化,兩者不包含隱含的1,用來表示0。
最簡單的精度算法就是:2^53是16位十進制,所以15位肯定能精確處理。
當然還有很多,有興趣可以自行查閱一下。
知道了這些,就能更好的理解一些數值的由來:Number.MAX_VALUE = 1.7976931348623157e+308; 尾數:1.xxx1,后面為52個1, 要得到最大值,我們就需要把小數點往后移,就靠指數1023-52,剩余971; 因此最大值等價于((Math.pow(2,53)-1)*Math.pow(2,971))
Number.MIN_VALUE =5e-324; 尾數:1.xxxx1,后面第52位為1,其余為0,這時首位的1需要隱藏, 這時候就是負了52位,在加上2^-1022, 等價于((Math.pow(2,-52))*Math.pow(2,-1022))
Number.MAX_SAFE_INTEGER = 9007199254740991; 安全數就是能夠精確處理的,精度靠尾數決定, 那我們來看當1.1111...1,小數點后接52個1,這是精度最大顯示, 要取其最大值那就是向指數借52位,所以最大安全數就等于Math.pow(2,53)-1 同理Number.MIN_SAFE_INTEGER = -9007199254740991; 對最大安全數添加負號即可重點0.1 + 0.2 怎么計算的呢?
首先,0.1轉二進制 :0.0 001100110011001100110011..0011 0011, 改寫為科學計數法表示:1.100110011...0011(0011)*2^-4, 尾數位為52為需要取舍括號中最后一位舍去進1,指數為-4,那個階碼就是-4+1023=1019, 最終浮點數格式: 0-01111111011-1001100110011001100110011001100110011001100110011010
同理0.2可以表示為: 0-01111111100-1001100110011001100110011001100110011001100110011010
最后兩者相加結果為: 0-01111111101-0011001100110011001100110011001100110011001100110100, 指數位為-2, 1.00110011001100110011001100110011001100110011001101(00)*2^-2 所以二進制表示: 0.0100110011001100110011001100110011001100110011001101(00), 那么轉為十進制就是0.1 + 0.2 = 0.30000000000000004 != 0.3
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97939.html
摘要:標準二進制浮點數算法就是一個對實數進行計算機編碼的標準。然后把取出的整數部分按順序排列起來,先取的整數作為二進制小數的高位有效位,后取的整數作為低位有效位。 浮點運算JavaScript 本文主要討論JavaScript的浮點運算,主要包括 JavaScript number基本類型 二進制表示十進制 浮點數的精度 number 數字類型 在JavaScript中,數字只有numb...
摘要:又如,對于,結果其實并不是,但是最接近真實結果的數,比其它任何浮點數都更接近。許多語言也就直接顯示結果為了,而不展示一個浮點數的真實結果了。小結本文主要介紹了浮點數計算問題,簡單回答了為什么以及怎么辦兩個問題為什么不等于。 原文地址:為什么0.1+0.2不等于0.3 先看兩個簡單但詭異的代碼: 0.1 + 0.2 > 0.3 // true 0.1 * 0.1 = 0.01000000...
摘要:由于浮點數不是精確的值,所以涉及小數的比較和運算要特別小心。根據標準,位浮點數的指數部分的長度是個二進制位,意味著指數部分的最大值是的次方減。也就是說,位浮點數的指數部分的值最大為。 一 前言 這篇文章主要解決以下三個問題: 問題1:浮點數計算精確度的問題 0.1 + 0.2; //0.30000000000000004 0.1 + 0.2 === 0.3; // ...
摘要:返回是,這是為什么呢我們知道浮點數計算是不精確的,上面的返回式實際上是這樣的在的新規范加入了一個新的東西是在對象上面,新增一個極小的常量。根據規格,它表示與大于的最小浮點數之間的差。上面的代碼為浮點數運算,部署了一個誤差檢查函數。 0.1+0.2 === 0.3 //返回是false, 這是為什么呢?? 我們知道浮點數計算是不精確的,上面的返回式實際上是這樣的:0.1 + 0.2 = ...
摘要:按照的數字格式,整數有的范圍是,而且只能表示有限個浮點數,能表示的個數為個。 0.1+0.2 等于0.3嗎?相信拿著這條題目隨便問一個高年級的小學生,他們都會毫不猶豫都回答:相等。是的,相等是正常的,這是常識。但是都說實踐是檢驗真理的唯一標準,拿這道簡單的算術題用javascript在chrome控制臺試驗一下: 結果令人大跌眼鏡,在控制臺輸入0.1+0.2 == 0.3返回的結果竟然...
閱讀 2618·2021-09-28 09:36
閱讀 2228·2021-09-07 09:58
閱讀 1492·2019-08-26 13:53
閱讀 1275·2019-08-23 17:53
閱讀 3023·2019-08-23 15:34
閱讀 1849·2019-08-23 15:34
閱讀 2864·2019-08-23 12:04
閱讀 3717·2019-08-23 10:56