如何在MASM 32中计算数字的对数?现有代码无输出求助
问题分析与修复方案
1. 无输出的原因
你的代码仅将计算结果存入了res变量,没有调用Irvine32库提供的浮点输出接口将结果打印到控制台,因此运行后看不到任何输出。
2. 精度不足的根源
你对fyl2x指令的使用和换底公式的应用存在错误:
fyl2x的运算规则是:ST(0) = ST(1) * log2(ST(0)),执行后弹出原ST(0),结果保留在栈顶- 换底公式使用错误:
- 自然对数(以e为底):
ln(x) = log2(x) * ln(2),直接使用内置常数fldln2加载ln(2)即可 - 常用对数(以10为底):
log10(x) = log2(x) * log10(2) = log2(x) / log2(10),你直接加载了log2(10)相乘,相当于算的是log2(10)*log2(x),和目标结果完全不符,这就是你认为精度不足的核心原因。
- 自然对数(以e为底):
3. 修正后的完整代码
INCLUDE Irvine32.inc .data num real8 2.5 ; 你要计算对数的数值 res real8 ? .code main PROC ; 示例1:计算自然对数 ln(2.5) fldln2 ; 加载ln(2)到ST(0) fld num ; 加载目标数值到ST(0),原ST(0)变为ST(1) fyl2x ; 计算 ln(2)*log2(2.5) = ln(2.5),结果存ST(0) fstp res ; 保存结果到res变量 ; 输出结果 fld res call WriteDouble ; Irvine32输出双精度浮点数的接口,精度更高 call CrLf ; 示例2:计算常用对数 log10(2.5) fldl2t ; 加载log2(10)到ST(0) fld1 ; 加载1到ST(0) fdiv ; 计算1/log2(10) = log10(2),结果存ST(0) fld num ; 加载目标数值到ST(0) fyl2x ; 计算 log10(2)*log2(2.5) = log10(2.5) fstp res ; 输出结果 fld res call WriteDouble call CrLf exit main ENDP END main
补充说明
fyl2x本身的运算精度符合IEEE双精度浮点数标准,只要参数使用正确不会出现精度缺失问题- 操作浮点栈时注意栈平衡,每次加载数值操作完成后要及时弹出,避免出现栈溢出错误
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

