关于Visual C++ 6.0浮点库反汇编代码的疑问

jsblcg 2004-12-18 11:58:57
下面是我反汇编的Visual C++ 6.0的浮点库中的一个小函数,其作用就是
将一个double数据载入ST(0),相当一条FLD指令。我百思不得其解的就是为什么
这个函数对特殊值作了类型转换,将其从double(IEEE 754双精度数据类型)
转换为IEEE 754的扩展精度类型,然后才装载,有这个必要吗?

代码不是完全的反汇编(要么不可能用C表示要么太难),而是示意性质

// pd存储于edx中,仅是示意,非真正代码
DWORD _fload_withFB( double data )
{
FLOAT_DOUBLE *pDouble = (FLOAT_DOUBLE*)&data;
FLOAT_EXTENDED Extended;

__int64 temp;

if( pDouble->nExponent != 0x7FF )
{
// 一般值,但可能是无效值
__asm fld data

// 返回指数信息
return DOUBLE_EXPONENT_INFO( data );
}
else
{
// 特殊值(NaN和无穷)
Extended.nSign = pDouble->nSign; // 1
Extended.nExponent = 0x7FFF; // 15

// 尾数是右对齐,double的nFraction2前有12位空白
temp = pDouble->nFraction1 |( pDouble->nFraction2 << 32 );
temp = temp << 12;
Extended.nFraction1 = temp & 0xFFFFFFFF;
temp = temp >> 32;
Extended.nFraction2 = temp & 0xFFFFFFFF;

__asm fld tbyte ptr [Extended]

// 返回指数和符号信息
return DOUBLE_SIGN_EXPONENT_INFO( data );
}
...全文
102 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
somedummy 2004-12-19
  • 打赏
  • 举报
回复
不太明白,扩展精度是多大范围的?
sharkhuang 2004-12-19
  • 打赏
  • 举报
回复
learning

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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