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

如何在MIPS(PCSPIM)中检查浮点除法的余数?

问题分析

你的代码问题出在判断逻辑上:你把原数除以2后和1.0比较,只有当原数恰好是2.0时才会判定为偶数。但其他偶数(比如50.0、4.0)除以2后得到的是25.0、2.0,显然不等于1.0,所以会被错误当成奇数,这就是输入5这类数值失效的原因。

你实际要判断的是原数是否为2的整数倍,也就是原数除以2后结果的小数部分为0。不用转成整数类型,用浮点数指令就能实现。

修正方案

核心思路:将原数除以2后对结果取整,再乘以2,和原数比较。如果相等,说明原数是偶数;否则是奇数。PCSPIM支持floor.s指令(对单精度浮点数向下取整),可以用这个实现。

修正后的代码如下:

.data
memoria: .space 1000
numero: .float 5.00
numero1: .float 1.00  # 标记奇数
numero2: .float 2.00  # 标记偶数
    .text

main:
    l.s $f0, numero
    l.s $f1, numero1
    la $s0, memoria

CICLO:
    addiu $sp, $sp, -4
    swc1 $f0, 0($sp)   # 保存原数到栈
    jal CHECKNUMEROPARI
    lwc1 $f0, 0($sp)   # 恢复原数
    addiu $sp, $sp, 4
    j EXIT  # 执行完判断后退出,避免无限循环

CHECKNUMEROPARI:
    l.s $f2, numero2   # 加载2.0
    div.s $f4, $f0, $f2  # $f4 = 原数 / 2
    floor.s $f5, $f4     # $f5 = 对结果向下取整
    mul.s $f5, $f5, $f2  # $f5 = 取整结果 * 2
    c.eq.s $f0, $f5      # 比较原数和取整后乘2的结果
    bc1t PARI            # 相等则为偶数
    # 奇数情况
    l.s $f3, numero1
    jr $ra

PARI:
    l.s $f3, numero2
    jr $ra

EXIT:
    li $v0, 10
    syscall
关键说明
  • 用floor.s对除以2后的结果取整,再乘以2,得到的是不大于原数的最大偶数。如果原数是偶数,这个结果会和原数相等;如果是奇数,结果会比原数小1。
  • 保留了你原代码中栈操作的逻辑,确保主程序中的$f0值不会被函数修改。
  • 对于正整数型浮点数,用ceil.s或round.s替代floor.s也能得到相同结果,可根据需求选择。

内容的提问来源于stack exchange,提问作者MATTEO DI LORENZO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:12:05