原本以为解决的问题,没想到还没搞定

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



----------------------------------------------------------------

...全文
69 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hiflower 2003-09-17
  • 打赏
  • 举报
回复
还要改一下:

if Exponent>127 then
Exponent:=Exponent-127 // 阶码改正
else
Exponent:=-Exponent;
hiflower 2003-09-15
  • 打赏
  • 举报
回复
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;

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧