-07-02 回答
若不对浮点数的表示作出明确规定,同一个浮点数的表示就不是唯一的。例如,十进制数可以表示成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 将十进制数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
如果觉得《计算机组成 规格化数 计算机组成原理 关于数据规格化浮点数的编码问题》对你有帮助,请点赞、收藏,并留下你的观点哦!