规格化浮点数
一个浮点数按指定的格式进行转换
规格化浮点数又称格式化输出,是指把一个浮点数按指定的格式进行转换。通常在报表统计展示、数据计算存储时需要格式化,常用的格式化函数有:format,cast等。
计算机组成原理
若不对浮点数的表示作出明确规定,同一个浮点数的表示就不是唯一的。例如,十进制数可以表示成1.11×100,0.111×101,0.0111×102等多种形式。为了提高数据的表示精度,当尾数的值不为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~1038(以10的幂表示)。
实例一
十进制数11.375表示为754标准存储格式(就是上文提到的一种规格化浮点数的国际标准
11.375=+1011.011=+(1.011011)×23=(-1)S×(1.M)×2e
可知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
格式化输出
又称格式化浮点数,是指把一个浮点数按指定的格式进行转换。
比如有一个浮点数2.102586,当用它来表示个数时,就要取掉小数部分,格式化为2;当用它来表示金额时,通常只保留2位小数,按四舍五入格式化为2.10或者按进一法格式化为2.11。
通常在报表统计展示、数据计算存储时需要格式化,常用的格式化函数有:format,cast等。
参考资料
最新修订时间:2023-12-09 13:10
目录
概述
计算机组成原理
参考资料