規格化浮點數

格式化浮點數又稱格式化輸出,是指把一個浮點數按指定的格式進行轉換。通常在報表統計展示、數據計算存儲時需要格式化,常用的格式化函式有:format,cast等。M是尾數,放在低位部分,占用23位,小數點位置放在尾數域最左(最高)有效位的右邊。它的尾數域所表示的值是1.M。--輸入整數,保存整數,輸入小數,如果 小數點後邊都是零,只保留一個零。--四捨五入後的位數長度減去取整後的位數長度行規教徒等於2的需要加一個零.

計算機組成原理

若不對浮點數的表示作出明確規定,同一個浮點數的表示就不是唯一的。例如,十進制數可以表示成1.11×10ˇ0,0.111×10ˇ1,0.0111×10ˇ2等多種形式。為了提高數據的表示精度,當尾數得值不為0時,尾數域的最高有效位應為1,這稱為浮點數的規格化表示。否則以修改階碼同時左右移小數點位置的辦法,使其變為規格化數的形式。

但在IEEE754標準中,一個規格化的32位浮點數x的真值表示為:

x=(-1)ˇS×(1.M)×2ˇ(E-127) e=E-127 其中S是浮點數的符號位,占1位。M是尾數,放在低位部分,占用23位,小數點位置放在尾數域最左(最高)有效位的右邊。E是階碼,占用8位。它的尾數域所表示的值是1.M。e為實際指數。因為規格化浮點數的尾數域最左位(最高有效位)總是1,故這一位經常不予存儲,而認為隱藏在小數點的左邊。

64位的浮點數中符號位1位,階碼域11位,尾數域52位,指數偏移值是1023.因此規格化的64位浮點數x的真值為

x=(-1)ˇS×(1.M)×2ˇ(E-1023) e=E-1023

特殊情形

當階碼E為全0且尾數也為全0時,表示的真值x為零,結合符號位S為0或1,有正零和負零之分。當階碼E為全1且尾數M為全0時,表示的真值x為無窮大,結合符號位S為0或1,也有+∞和-∞之分。這樣在32位浮點數表示中,要除去E用全0和全1(十進制的255)表示零和無窮大的特殊情況,指數的偏移值不選128(10000000),而選127(01111111)。對於規格化浮點數,E的範圍變為1到254,真正的指數值e則為-126到+127.因此32位浮點數表示的絕對值的範圍是10ˇ-38~10ˇ38(以10的冪表示)。

實例一

將十進制數11.375表示為754標準存儲格式(就是上文提到的一種規格化浮點數的國際標準)

11.375=+1011.011=+(1.011011)×2ˇ3=(-1)ˇS×(1.M)×2ˇe

可知S=0,包括隱藏位1的尾數1.M=1.011011=1.011 0110 0000 0000 0000 0000 e=3

E=e+127=130=011+01111111=10000010

則二進制數格式為

0 1000 0010 0110 1100 0000 0000 0000 0000

- ------------- ---------------------------

↑ ↑ ↑

S 階碼(8位) 尾數(23位)

實例二

create table 浮點數(浮點數);

insert into 浮點數 values(1.00);

insert into 浮點數 values(1.10);

insert into 浮點數 values(1.021);

insert into 浮點數 values(1.01);

insert into 浮點數 values(100.2);

insert into 浮點數 values(0.586);

insert into 浮點數 values(299.999);

insert into 浮點數 values(53.000);

insert into 浮點數 values(35003.12);

.mode column

.h on

select * from 浮點數;

浮點數

----------

1.0

1.1

300

1.021

1.01

100.2

0.586

299.999

53.0

35003.12

--輸入整數,保存整數,輸入小數,如果 小數點後邊都是零,只保留一個零。

-- 四捨五入ROUND(欄位名,保留小數點位數)

select 浮點數, round(浮點數,2) 四捨五入from 浮點數;

浮點數 四捨五入

---------- ------------

1.0 1.0

1.1 1.1

300 300.0

1.021 1.02

1.01 1.01

100.2 100.2

0.586 0.59

299.999 300.0

53.0 53.0

35003.12 35003.12

--四捨五入保留2位小數,整數後面加一個零.

select round(浮點數,2),LENGTH(ROUND(浮點數,2))-LENGTH(CAST(浮點數 AS INTEGER)) from 浮點數;

round(浮點數,2) LENGTH(ROUND(浮點數,2))-LENGTH(CAST(浮點數 AS INTEGER))

------------------ ------------------------------------------------------

1.0 2

1.1 2

300.0 2

1.02 3

1.01 3

100.2 2

0.59 3

300.0 2

53.0 2

35003.12 3

0.5 2

--四捨五入後的位數長度減去取整後的位數長度行規教徒等於2的需要加一個零.

sqlite> SELECT 浮點數 AS 'raw value', (ROUND(浮點數,2)) AS 'RND value' , CASE WHEN (LENGTH(ROUND(浮點數,2))) - (LENGTH(CAST(浮點數 AS INTEGER)) ) =2 THEN SUBSTR(' '||(ROUND(浮點數,2))||'0', -10,10) ELSE SUBSTR(' '||(ROUND(浮點數,2 )),-10,10) END AS 'result' FROM 浮點數;

raw value RND value result

---------- ---------- ----------

1.0 1.0 1.00

1.1 1.1 1.10

300 300.0 300.00

1.021 1.02 1.02

1.01 1.01 1.01

100.2 100.2 100.20

0.586 0.59 0.59

299.999 300.0 300.00

53.0 53.0 53.00

35003.12 35003.12 35003.12

0.5 0.5 0.50

相關詞條

熱門詞條

聯絡我們