MainFrame知识小结(20120117)—浮点数

概述

   浮点数float)是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体来说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次得到,这种表示方法类似于基数为10科学记数法

  IBM MainFrame中浮点数的存储格式并不是按照IEEE 754标准。虽然原理相类,但细节不同。

  对于COBOLHLASM来说,只有浮点数是带有小数位的运算。其它运算都是按整数运算,比如PIC 9(8).9(3),实际上小数点是不会出现在内存中。

 

类型

类型

长度

COBOL类型

短数

4Byte

COMP-1

长数

8Byte

COMP-2

扩展数

16Byte

COBOL好像没有对应的类型

 






结构

符号位

阶码

尾数

  


  符号位(sign)

  符号位为浮点数的第一个bit0为正,1为负。

 

  阶码(exponent)

  阶码为紧跟符号位的7bit,范围就是[027-1],为了表示正负,该范围实际上是减去64的,也就是[-6463]

 

  尾数(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)维基百科

  http://zh.wikipedia.org/wiki/%E6%B5%AE%E7%82%B9%E6%95%B0

posted @ 2012-01-17 08:12  小冰  阅读(880)  评论(2编辑  收藏  举报