我正在尝试编写 MIPS 代码来递归计算数字的幂。一切似乎都是正确的,但在一个测试用例中我得到了5^-2 = 0.04000000000000001
. 我认为这是由于我的计算机的体系结构造成的。我是对的还是我的代码有问题?
为了更好地理解,数据段中有一个双精度数组和一个整数幂数组。
这是代码:
.data
double_array: .double 5.0 2.0 -3.0 -3.0 -4.2 5.0 -2.0 0.0 0.0
power_array: .word -2 -4 2 1 0 -2 -3 0 10
N_OF_CASES: .word 9
str_case: .asciiz "case_"
str_colon: .asciiz ": "
str_equal: .asciiz " = "
str_power: .asciiz "^"
str_newLine: .asciiz "\n"
one: .double 1.0
zero: .double 0.0
main:
lw $t1, N_OF_CASES
la $t2, double_array
la $t3, power_array
li $t4, 0
loop:
lw $a1, ($t3)
lw $t0, ($t3)
l.d $f14, ($t2)
l.d $f16, ($t2)
jal power
li $v0, 3
mov.d $f12, $f16
syscall
li $v0, 4
la $a0, str_power
syscall
li $v0, 1
move $a0, $t0
syscall
li $v0, 4
la $a0, str_equal
syscall
li $v0, 3
mov.d $f12, $f0
syscall
la $v0, 4
la $a0, str_newLine
syscall
addi $t2, $t2, 8
addi $t3, $t3, 4
addi $t4, $t4, 1
subi $t1, $t1, 1
bnez $t1, loop
li $v0 10
syscall
power:
andi $sp 0xfffffff8
addi $sp $sp -16
s.d $f20 ($sp)
sw $ra 8($sp)
li $t7, 0
beq $a1, $t7, base_case
bgez $a1, not_negative
l.d $f2, one
div.d $f14, $f2, $f14
li $t6, -1
mul $a1, $a1, $t6
j power
not_negative:
mov.d $f2, $f14
subi $a1, $a1, 1
jal power
mul.d $f0, $f0, $f2
power_done:
l.d $f20, ($sp)
lw $ra, 8($sp)
addi $sp, $sp, 16
jr $ra
base_case:
l.d, $f0, one
j power_done
我在评论中提供的浮点参考回答了您的问题。
然而,对于发布的代码,这
j power
是高度可疑的。它跳转到函数的开头,运行序言并创建另一个堆栈帧,但尚未被调用。如果这是尝试进行尾部调用优化,您应该跳过序言以在序言之后重新进入函数。否则,jal power
虽然你必须j powerDone
在后面添加,但更合适。您的寄存器用法是非标准的。