如何在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
相关产品推荐
相关产品推荐

