MainFrame知识小结(20120117)—浮点数
概述
浮点数(float)是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体来说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。
IBM MainFrame中浮点数的存储格式并不是按照IEEE 754标准。虽然原理相类,但细节不同。
对于COBOL、HLASM来说,只有浮点数是带有小数位的运算。其它运算都是按整数运算,比如PIC 9(8).9(3),实际上小数点是不会出现在内存中。
类型
-
类型
长度
COBOL类型
短数
4Byte
COMP-1
长数
8Byte
COMP-2
扩展数
16Byte
COBOL好像没有对应的类型
结构
-
符号位
阶码
尾数
符号位(sign)
符号位为浮点数的第一个bit,0为正,1为负。
阶码(exponent)
阶码为紧跟符号位的7个bit,范围就是[0,27-1],为了表示正负,该范围实际上是减去64的,也就是[-64,63]。
尾数(mantissa)
尾数是紧跟阶码的剩余bits。对于短数来说是24bit;对于长数56bit;对于扩展数有点特别,第二个双字开始8bit不使用的所以尾数有56*2bit。尾数的最开始默认就是有一小数点的!
短数
-
1bit
7bit
24bit
长数
-
1bit
7bit
56bit
扩展数
-
1bit
7bit
56bit
8bit
56bit
例子
以下例子都以短浮点数为例,长浮点数和扩展浮点数可以此类推
1.浮点数+133
x'42 85 00 00'
b'0100001010000101 00000000 00000000'
- 第一位为0,则为正数
-
紧跟的7位为100010(2),即66(10),实际就是66-64=2。注意这里是十进制的!
-
最后24位为x'850000',即0.85(16)。
-
0.85*162 = 85(16) = 133(10)
2.浮点数-0.03125
x'BF 80 00 00'
b'1011111110000000 00000000 00000000'
-
第一位为1,则为负数
-
紧跟的7位为0111111(2),即63(10),实际就是63-64=-1。
-
最后24位为x'800000',即0.8(16)。
-
-0.8*16-1 = 0.08(16) = -0.03125(10)
参考
(1)IBM高校合作课程:第二章 S390内存使用:
http://ibmur.hust.edu.cn/ZOS-ASM/
(2)How exactly do floating-point fields work?
http://www.tek-tips.com/faqs.cfm?fid=5154
(3)维基百科