js 單精度浮點數轉10進製 浮點數轉換為十進位制數

2021-10-13 10:32:52 字數 1846 閱讀 3567

題目:將32位浮點數 01000010111011010000000000000000 轉換為十進位制格式

根據國際標準ieee 754,任意乙個二進位制浮點數v可以表示成下面的形式:

(1)(-1)^s表示符號位,當s=0,v為正數;當s=1,v為負數。

(2)m表示有效數字,大於等於1,小於2。

(3)2^e表示指數字。

ieee754標準中規定float單精度浮點數在機器中表示用 1 位表示數字的符號,用 8 位來表示指數,用23 位來表示尾數,即小數部分。對於double雙精度浮點數,用 1 位表示符號,用 11 位表示指數,52 位表示尾數,其中指數域稱為階碼。

題目中的32位浮點數,可以寫為 s+e+m 三部分的形式:0 10000101 11011010000000000000000

f87af9b3-96a6-4892-bbd7-107968f22b5b.png

ieee 754對有效數字m和指數e,還有一些特別規定。

有效數字 m ,1≤m<2,也就是說,m可以寫成1.******的形式,其中******表示小數部分。ieee 754規定,在計算機內部儲存m時,預設這個數的第一位總是1,因此可以被捨去,只儲存後面的******部分。比如儲存1.01的時候,只儲存01,等到讀取的時候,再把第一位的1加上去。這樣做的目的,是節省1位有效數字。以32位浮點數為例,留給m只有23位,將第一位的1捨去以後,等於可以儲存24位有效數字。

至於指數e,首先,e為乙個無符號整數(unsigned int)。這意味著,如果e為8位,它的取值範圍為0-255;如果e為11位,它的取值範圍為0-2047。但是,我們知道,科學計數法中的e是可以出現負數的,所以ieee 754規定,e的真實值必須再減去乙個中間數,對於8位的e,這個中間數是127;對於11位的e,這個中間數是1023。

指數e還可以再分成三種情況:

e不全為0或不全為1。

這時,浮點數就採用上面的規則表示,即指數e的計算值減去127(或1023),得到真實值,再將有效數字m前加上第一位的1。

e全為0。

這時,浮點數的指數e等於1-127(或者1-1023),有效數字m不再加上第一位的1,而是還原為0.******的小數。這樣做是為了表示±0,以及接近於0的很小的數字。

e全為1。

這時,如果有效數字m全為0,表示±無窮大(正負取決於符號位s);如果有效數字m不全為0,表示這個數不是乙個數(nan)。

舉例來說,

十進位制的5.0,寫成二進位制是101.0,相當於1.01×2^2。那麼,按照上面v的格式,可以得出s=0,m=1.01,e=2。

十進位制的-5.0,寫成二進位制是-101.0,相當於-1.01×2^2。那麼,s=1,m=1.01,e=2。

public static void main(string args) else else {

_b = _b[1].length;

if (_b > _a)_a = _b;

_b = "1";

for (; _a > 0; _a--) {

_b = _b + "0";

switch (h) {

case"+":

return (a * _b + b * _b) / _b;

break;

case"-":

return (a * _b - b * _b) / _b;

break;

case"*":

return ((a * _b) * (b * _b)) / (_b * _b);

break;

default:

return 0;

var a = 0.1;

var b = 0.2;

console.log(overflow(a, "+", b));

單精度浮點數轉化為10進製數的原理

在做modbus通訊時經常會用到單精度浮點數來表示測量值,比如41 20 00 00代表十進位制的10,用 可以輕鬆實現轉換,但是他是怎麼計算出來的呢?查了一些資料後我知道了計算的方法,在此記錄一下。比如10,他的單精度浮點數時41 20 00 00,先將其從16進製制轉換為10進製,就是65 32...

單精度浮點數(IEEE754)

單精度浮點數佔據4個位元組,4個位元組的分配如下 a 第一位為符號位,0表示正,1表示負 b 第2 9位為階碼,採用移碼表示 c 第10 32位為尾數,採用原碼表示。1 給定32位串,如何轉換成十進位制數 假設記憶體中存在32位串 cd cc 08 41。因為intel cpu採用little en...

半精度浮點數到單精度的python 實現

實現原理可參考3.參考文獻部分。輸入引數s是字串形式的16位二進數,如 0011010101010101 def halfpre2spre s s代表16位二進數,sign int s 0 res0 pow 1 sign 符號位 exp int 0b s 1 6 2 指數字 endpre s 6 尾...