You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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),和目标结果完全不符,这就是你认为精度不足的核心原因。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:15:04