IEEE 754浮点数表示标准
处理步骤
1.首先把16进制字符转换为二进制的字符。8个十六进制字符得到32个二进制字符
2.然后按32位浮点数表示把二进制数据处理成十进制浮点数
3.左边第一个二进制是正负位,0正数,1负数
4.然后紧接着的八位是阶码、最后二十三位是尾数
5.假设阶码的二进制串是E,尾数的是M。转换的十进制的阶码是E10,十进制的位数是M10,正负位按最高位为1或-1,变量约定S10
6.计算公式为(S10*(1+(M10*(2^(-23)))))*(2 ^(E10-127))
Caché实现事列
// w ##Class(OTH.TEST).M16StrToFloat("40A00000")
// w ##Class(OTH.TEST).M16StrToFloat("40A0E003")
// w ##Class(OTH.TEST).M16StrToFloat("30A0E003")
ClassMethod M16StrToFloat(str)
{
s Ret=""
i $l(str)'=8 q "不是32位浮点数的16进制"
//32位浮点数
i $l(str)=8 d
.s AllBit=""
.f i=1:1:8 d
..s OneChar=$e(str,i,i)
..s OneBit=""
..i OneChar="0" s OneBit="0000"
..i OneChar="1" s OneBit="0001"
..i OneChar="2" s OneBit="0010"
..i OneChar="3" s OneBit="0011"
..i OneChar="4" s OneBit="0100"
..i OneChar="5" s OneBit="0101"
..i OneChar="6" s OneBit="0110"
..i OneChar="7" s OneBit="0111"
..i OneChar="8" s OneBit="1000"
..i OneChar="9" s OneBit="1001"
..i OneChar="A" s OneBit="1010"
..i OneChar="B" s OneBit="1011"
..i OneChar="C" s OneBit="1100"
..i OneChar="D" s OneBit="1101"
..i OneChar="E" s OneBit="1110"
..i OneChar="F" s OneBit="1111"
..s AllBit=AllBit_OneBit
.//正负位,0正数,1负数
.s S=$e(AllBit,1,1)
.s S10=1
.i S="1" s S10=-1
.//阶码
.s E=$e(AllBit,2,9)
.//尾数
.s M=$e(AllBit,10,32)
.//10进制的阶码值
.s E10=0
.s ENum=1
.f i=8:-1:1 d
..s CurChar=$e(E,i,i)*ENum
..s E10=E10+CurChar
..s ENum=ENum*2
.//10进制的尾数值
.s M10=0
.s MNum=1
.f i=23:-1:1 d
..s CurChar=$e(M,i,i)*MNum
..s M10=M10+CurChar
..s MNum=MNum*2
.s Ret=(S10*(1+(M10*(2**(-23)))))*(2**(E10-127))
q Ret
}