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