32位IEEE和IBM浮点数结构及其转换方法
符茂松
【摘 要】不同体系架构的计算机系统之间的浮点数交换与共享,对于地震数据处理具有重要意义.32位IEEE和IBM浮点数是SEGY地震数据中的两种常用数据格式,其格式转换不仅涉及阶码和尾数的表达,还涉及到浮点数存储的方式.本文在分析32位IEEE和IBM浮点数的存储格式基础上,给出两者之间的转换算法和C++语言源代码,对代码进行封装和简单的API调用,并成功应用于地震数据处理.
【期刊名称】《工程地球物理学报》
【年(卷),期】2011(008)006
【总页数】8页(P759-766)
【关键词】浮点数;结构;转换;地震数据;IBM;IEEE
【作 者】符茂松
【作者单位】华中科技大学软件学院,湖北武汉430074
【正文语种】中 文
【中图分类】P631
不同体系架构的计算机系统中,浮点数在表达和存储上存在较大差别。在SEGY地震资料中,数据可采用IEEE或者IBM格式浮点数存储[1]。特定计算机硬件平台,只能处理与自己硬件平台相同格式的浮点数,若浮点数格式不属于目标处理机能够处理的格式,则需进行格式转换。不同类型浮点数之间转换,不仅涉及到阶码和尾数的表达,还涉及到浮点数存储的方式,以及位和位域的操作等问题。为此,本文设计了一个函数库并提供API接口,用户可以简单直观地实现两种类型浮点数之间的转换。
计算机中32位浮点数存储在连续的4个字节中,不同体系架构的计算机系统,有不同的字节序。
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存放顺序,分为大字节序(Big Endian)、小字节序(Little Endian)和混合序(Middle-endian)[2]。
每个数据都有所谓的“有效字节(Significant byte)”,表示这个数据所占用的字节。例如一个32位整型数,其有效位是4个字节。而对于0x0A0B0C0D来说,作为一个256进制数(相对于10进制数),其有效字节从高到低分别为0A、0B、0C及0D。
大字节序(Big Endian)指其“最高有效字节(Most Significant Byte)”落在低地址上的存储方式。例如地址a写入0x0A0B0C0D之后,在内存中的数据:
float几个字节多少位而小字节序(Little Endian)正好相反,其“最低有效字节(Least Significant Byte)”放在低地址上。例如:
常用的CPU架构如Intel、AMD的CPU使用的都是小字节序,而以前Mac OS使用的是Power PC大字节序(现在Mac OS也使用Intel的CPU)。
此外,还有一种很少见的混合序(middle endian),以2143的方式保存数据(相对于大字节序的1234及小字节序的4321),在此不再累述。
可以通过以下C函数来判断处理器是大字节序还是小字节序:
int checkCPU()
int x=1;
if(*(char*)&x==1)
return 1;
else
return 0;
若处理器是大字节序则返回0;若是小字节序,则返回1。
下文叙述中,假设处理器类型都是小字节序。大字节序的处理器,可以经过换位处理后进行等效于小字节序的处理。
浮点数是有理数中的特定子集,对于给定的实数,在计算机中用近似值表示。具体来说,这
个实数经常用下式得到[3]:
其中,V为实数值;S为符号,当V为正数时,取0,V为负数时,取1;M为尾数,代表实数值的有效数字部分,相当于有效数字的整数部分(C)加上有小数部分(F);A为基数;E为指数;B为指数偏移;
换句话说,这个实数由一个有效数字部分(即尾数)乘以某个基数的整数次幂得到的,这种表示方法类似于基数为10的科学记数法,其中,根据计算机架构(如IEEE和IBM架构)选用不同的常量A、B、C。
32位IEEE单精度浮点数存储在4个连续字节中[4,5],如图3。
32位IBM单精度浮点数存储在4个连续字节中[6,7],如图4。
S代表符号,E(Exponent)代表指数部分,F(Fraction)代表小数部分。
V=(-1)S×M×A(E-B)
M=C+F
32位IEEE浮点数:A=2,B=127,C=1;
32位IBM浮点数:A=16,B=64,C=0。
需要注意的是,无论是IEEE浮点数还是IBM浮点数,都用了特定的32位二进制数编码分别表示0(包括+0和-0)、无穷大(包括正无穷大和负无穷大)和非数字。这些特定二进制数编码不符合浮点数基本计算公式,故在32位IEEE浮点数和IBM浮点数之间需要进行对应转换,其对应关系如表1。
SEGY地震资料中,0经常出现,而无穷大和非数字较少出现。因此,本文提供的算法和代码中,只考虑0在32位IEEE浮点数和IBM浮点数之间的转换。
上文已经提及,F区域用于存储浮点数的小数部分。显然,对于IEEE格式浮点数,F的最小值为1/223(非0);对于IBM非0的浮点数,F的最小值为1/16,而不是1/224。因为F最多只能前3位为0,若第4位也为0,则违反了IBM格式的存储规则。
当F个位为1时,小数部分达到最大值。根据等比数列求和公式,可以得出:
1/2+1/4+1/8+…+1/2n=1-1/2(n-1)
以G代表小数区域的最大值,则:
32位IEEE浮点数:G=1-1/222
32位IBM浮点数:G=1-1/223
由于浮点数有效数字部分M=C+F,可以算出各格式下浮点数的有效数字范围:
32位IEEE浮点数:1<=M<=2-1/222
32位IBM浮点数:1/16<=M<=1-1/223
以E代表浮点数的指数部分,实际值为EB。其中B为指数偏移值,目的是实现负指数。
32位IEEE浮点数:0<=E<=254(255代表特定概念)
32位IBM 浮点数:0<=E<=126(127代表特定概念)
设T为浮点数绝对值的大小,则
32位IEEE浮点数:(1+1/223)×2-127<=T<=(2-1/222)×2 127
32位IBM 浮点数:(1/16)×16-64<=T<=(1-1/223)×16 62