关于纯小数转换成阶码+尾数的形式 ( 积分: 30 )

  • 主题发起人 主题发起人 jinms
  • 开始时间 开始时间
J

jinms

Unregistered / Unconfirmed
GUEST, unregistred user!
纯小数,例如:0.01,转成二进制表示应该为:0.000 000 101,规格化是小数点右移6位
变为:尾数(0.101),阶码(6)怎么样用函数实现,最后转为十六进制啊?

我的问题就是纯小数如何转换成十六进制的尾数+阶码表示?
例如:0.01-------> D7 A3 06

就三十分了,请大侠帮忙,谢谢
 
纯小数,例如:0.01,转成二进制表示应该为:0.000 000 101,规格化是小数点右移6位
变为:尾数(0.101),阶码(6)怎么样用函数实现,最后转为十六进制啊?

我的问题就是纯小数如何转换成十六进制的尾数+阶码表示?
例如:0.01-------> D7 A3 06

就三十分了,请大侠帮忙,谢谢
 
大侠们帮看看了,我就想要一个把小数转成十六进制的函数
 
学习中...........
 
没人帮忙,我自己写了一个函数,对小数转换时还有问题,哪位帮看看
function TForm1.FloatToHex(iNum: Double): string;
var
i , nbit:integer;
sign : Boolean ;//true + , false -
tmpInt :integer;
tmpDec :Double;
str , sDec :string;
begin
nbit := 0;
//符号位
if iNum >0 then
sign := true
else begin
sign := false;
iNum := abs(iNum);
end;
//
tmpInt := Floor(iNum);
//整数 + 小数
if tmpInt >0 then
begin
while tmpInt >0 do
begin
tmpInt := tmpInt shr 1 ;
nbit := nbit + 1;
end;
i :=0;
while i <16-nbit do
begin
iNum := iNum *2;
i := i + 1;
end;
tmpInt := Floor(iNum) shr 8;
end else
//纯小数
begin
tmpDec := iNum;
while tmpDec > 0 do
begin
tmpDec := tmpDec * 2;
if tmpDec >=1 then
tmpDec := tmpDec - 1 ;
nbit := nbit + 1;
//if nbit > 15 then break;
end;
i :=0;
while i <nbit do
begin
iNum := iNum * 2;
i := i + 1;
end;
tmpInt := Trunc(iNum) shr 8;
end;
showmessage(floattostr(iNum));

str := IntToHex(tmpInt , 4);
if sign then //正数阶码返回 40H + n
str := str + inttohex(64 + nbit , 2)
else //负数阶码返回 C0H + n
str := str + inttohex(192 + nbit , 2);

Result := str;

end;
 
没人会吗?以下是C++的,谁能给翻译成DELPHI的也成啊
//=========================================================
//============== FloatToChar() ===============
//========== Fvalue: float parament ===============
//========== pch: pointer for saving result =============
//=========================================================
void FloatToChar(float Fvalue,unsigned char *pch)
{
unsigned char n,i;
n=0;
//============ positive or negative =========
if( Fvalue>0)
{
sign=0;
}
else
{
sign=1;
Fvalue=fabs(Fvalue);
}
//============ get rank ============
intPart=Fvalue;
while(intPart>0)
{
intPart>>=1;
n++;
}
if(sign)
*pch=0xC0+n;
else
*pch=0x40+n;

//============ get mantissa ============
for(i=0;i<16-n;i++)
{
Fvalue*=2; //Fvalue shift right 16-n bits
}
pch++;
*pch=(int)Fvalue>>8;
pch++;
*pch=(int)Fvalue &amp; 0x00FF;

}
 
忙了一下午,终于做出来了 :)

function TForm1.DoubleToHex(iNum: Double): string;
var
i , nbit ,tmpInt :integer;
rank , mantissa , sDec:string;
sign : boolean;
tmpDec :double;
begin
nbit := 0;
//符号位
if iNum >0 then
sign := true
else begin
sign := false;
iNum := abs(iNum);
end;

tmpInt := Trunc(iNum);
//整数+小数
if tmpInt >0 then
begin
//取阶码
while tmpInt > 0 do
begin
tmpInt := tmpInt shr 1;
nbit := nbit + 1;
end;
//取尾数
for i := 1 to 16 - nbit do
iNum := iNum * 2;
mantissa := InttoHex(Trunc(iNum),4);
end else
//纯小数
begin
sDec :='';
tmpDec := iNum;
while tmpDec >0 do
begin
tmpDec :=tmpDec * 2;
if tmpDec >=1 then
begin
sDec :=sDec + '1';
tmpDec := tmpDec - 1;
end else
sDec := sDec +'0';
end;
//取阶码
for i := 1 to length(sDec) do
begin
if copy(sDec, i,1)='1' then
begin
sDec := copy(sDec , i ,length(sDec)- i + 1);
break;
end;
nbit := nbit + 1;
end;
//取尾数
if length(sDec)<16 then
begin
for i := 1 to 16 - length(sDec) do
sDec := sDec +'0';
end
else begin
sDec := copy(sDec , 1 , 16);
end;
nbit := -1 * nbit;

mantissa := IntToHex(BinToInt(sDec),4);
end;

if sign then
//40H + n
rank := IntToHex(64 + nbit , 2)
else
//C0H + n
rank := IntToHex(192 + nbit , 2);

Result := Copy(mantissa , 3 ,2) + copy(mantissa , 1 ,2) + rank;
end;
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部