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