原本以为解决的问题,没想到还没搞定
ekin 2003-09-15 01:24:23 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
----------------------------------------------------------------