淡泊明志 宁静致远
分类: C/C++
2006-12-08 10:07:20
【C语言库函数源代码】
【本程序在Dev C++ 4.9.9.2 下编译通过】
/*
装载浮点数,v是尾数,e为指数。
如:x=ldexp(1.0,6);则表示要转载的浮点数是1.0*2^6
*/
double my_ldexp01(double v, int e)
{
double two =
2.0;
if (e < 0)
{
e = -e; /*这句话和后面的if语句是用来对两位溢出码的机器*/
if (e <
0) return 0.0;
while (e
> 0)
{
if (e
& 1) v /= two;
two *= two;
e
>>= 1;
}
}
else if (e > 0)
{
while (e
> 0)
{
if (e
& 1) v *= two;
two *= two;
e >>= 1;
}
}
return v;
}
double my_ldexp02(double v, int e)
{
double temp1,
texp, temp2;
texp = e;
__asm__(
"fscale "
: "=u" (temp2), "=t"
(temp1)
: "0" (texp), "1" (v)
);
return
(temp1);
}
main()
{
float x,y;
y = 1.0;
x=my_ldexp01(y,6); // 1.0*2^6
printf("2^6=%.2f\n",x);
x=my_ldexp01(-y,6); // 1.0*2^6
printf("2^6=%.2f\n",x);
x=my_ldexp02(y,6); // 1.0*2^6
printf("2^6=%.2f\n",x);
x=my_ldexp02(-y,6); // 1.0*2^6
printf("2^6=%.2f\n",x);
system("pause");
return 0;
}