function toFloat(n:Integer):Double;
var
  Sign:Integer;
  Exponent:Integer;
  Mantissa:Double;
begin
  if (n and $80000000)=0 then
    Sign:=1
  else
    Sign:=-1;  Exponent:=(n and $7FFFFFFF) shr 23;
  if Exponent>127 then
    Exponent:=128-Exponent;  Mantissa:=(n and $007FFFFF)/Power(2,23);
  Result:=Sign*Mantissa*Power(2,Exponent);
end;   解法似乎有点问题,比如说40B00000得出的结果是5.5,而用你的程序得出的是0.1875,
   故国曾给我一个解答,我曾经以为,但最终发现也不行,比如,0000e840,实际应大约为1.0,但用它的方法得出为8.33156014948963e-41,
下面是故国的方法
var
  I: Integer;
  R: Single;
begin
  I := $0000e840;
  Move(I, R, SizeOf(I));
  ShowMessage(FloatToStr(R));
end;恳请再指教一次
一个数据,其占用4个字节(32位二进制数),其格式如下:
  seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
s为符号位,保存在最高字节的最高位,‘1’表示负,‘0’表示正,e为 阶码,占用8位二进制数,保存在高两个字节中,m为尾数的小数部分,用二十三位二进制数表示,保存在低三个字节中,尾数的整数部分永远为1,因此,不保存。小数点位于隐含的整数位‘1’的后面。阶码表示小数点要移位的数目,大于127时右移‘阶码-127’位,小于时左移,然后化为十进制数,7位有效数字。
例如:40B00000化为5.500000, 42F98000化为124.75
 
----------------------------------------------------------------

解决方案 »

  1.   

    function toFloat(n:Integer):Double;
    var
      Sign:Integer;
      Exponent:Integer;
      Mantissa:Double;
    begin
      if (n and $80000000)=0 then
        Sign:=1
      else
        Sign:=-1;  Exponent:=(n and $7FFFFFFF) shr 23;
      if Exponent>127 then
        Exponent:=Exponent-127; // 阶码改正  Mantissa:=(n and $007FFFFF)/Power(2,23)+1;//加上整数部分 1
      Result:=Sign*Mantissa*Power(2,Exponent);
    end;
      

  2.   

    还要改一下:if Exponent>127 then
        Exponent:=Exponent-127 // 阶码改正
    else
       Exponent:=-Exponent;