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