请问怎样将16进制数转换为双精度浮点数?   
  例如:C0 66 F4 00 00 00 00 00  转换为双精度浮点数应为多少?   
一个8字节的双精度浮点数转换成16进制又如何?

解决方案 »

  1.   

    转自GOOGLE搜索>>>对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数), 
    1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示; 
    2、第30~23 bit为幂数,其读数值用e表示; 
    3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x; 则按照规定,该浮点数的值用十进制表示为: 
    = (-1)^s  * (1 + x) * 2^(e - 127) 对于49E48E68来说, 
    1、其第31 bit为0,即s = 0 
    2、第30~23 bit依次为100 1001 1,读成十进制就是147,即e = 147。 
    3、第22~0 bit依次为110 0100 1000 1110 0110 1000,也就是二进制的纯小数0.110 0100 1000 1110 0110 1000,其十进制形式为0.78559589385986328125,即x = 0.78559589385986328125。 这样,该浮点数的十进制表示 
    = (-1)^s  * (1 + x) * 2^(e - 127) 
    = (-1)^0  * (1+ 0.78559589385986328125) * 2^(147-127) 
    = 1872333 
      

  2.   

    function DoubleToHex(Value: Double): String;
    var
      bArray : array[0..7] of Byte;
      iLoop  : Integer;
    begin
      CopyMemory(@bArray[0], @Value, 8);
      Result := '';
      for iLoop := 0 to 7 do
        Result := Result + IntToHex(bArray[iLoop], 2) + ' ';
      Result := Trim(Result);;
    end;function HexToDouble(Hex: String): Double;
    var
      iLoop  : Integer;
      bArray : array[0..7] of Byte;
    begin
      for iLoop := 0 to 7 do
        bArray[iLoop] := StrToInt('$' + Copy(Hex, iLoop * 3 + 1, 2));
      CopyMemory(@Result, @bArray[0], 8);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      dValue : Double;
    begin
      ShowMessage (DoubleToHex(7384.36));
      dValue := HexToDouble('C0 66 F4 00 00 00 00 00');
      ShowMessage (FloatToStr(dValue));
    end;