Арифметическое переполнение в расчете MIPS
Это домашняя проблема, и поскольку я не знаю, где искать, я прилагаю свой код, чтобы посмотреть, сможете ли вы, ребята, помочь. Нас просят написать программу для расчета e^x по формуле e^x = 1 + x/1 + x^2/2! + х ^3/3! + ... Итак, я все это сделал, или я думаю, что я это сделал, однако, когда я компилирую его и ввожу любое значение, я получаю проблему арифметического переполнения. Я новичок в MIPS, поэтому я не понимаю, где происходит переполнение, чтобы я мог это исправить?
# Constants:
# $f2 = zero
# $f4 = one
# $f6 = two
# $f8 = lssthn
# $f10 = x
# $f14 has result of factorial
# $f18 has result of exponent calculation
# $f20 has the next term which needs to be compared to lssthn
exp:
l.d $f2, zero
l.d $f4, one
l.d $f6, two # counter for factorial and exponent
l.d $f8, lssthn # load 1.0e-15 into f4 for comparision in For
l.d $f14, zero
mov.d $f10, $f12 # this is the x argument
add.d $f10, $f10, $f4 # $f10 = 1 + x
li $s0, 2 # factorial counter
li $s1, 1
For:
move $a0, $s0 # move factorial counter to a0
jal fact
move $s1, $v0 # move the result of factorial to s1
mtc1 $s1, $f14
cvt.d.w $f14, $f14
add $s0, $s0, $s1 # increase the factorial by 1
add.d $f16, $f12, $f2 # X is saved in $f16
add.d $f18, $f16, $f2
mul.d $f18, $f18, $f16
div.d $f20, $f18, $f14
c.le.d $f20, $f8 # compare if next term is less than lssthn
bc1t Out
add.d $f10, $f10, $f20 # $f10 = $f10 + $f20
j For
Out:
mov.d $f0, $f10
jr $ra
fact:
slti $t0, $a0, 1 # test for n < 1
beq $t0, $zero, L1 # if n >= 1, go to L1
li $v0, 1 # return 1
jr $ra # return to instruction after jal
L1:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
addi $a0, $a0, -1 # n >= 1; argument gets (n – 1)
jal fact # call fact with (n – 1)
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $a0, $v0 # return n * fact (n – 1)
jr $ra
main:
la $a0, wlcm #print welcome statement
li $v0, 4
syscall
Loop:
la $a0, xreq #request value of x
li $v0, 4 #read value x
syscall
li $v0, 6 #read the value of x
syscall
l.d $f16, flag
c.eq.d $f16, $f0
bc1t Exit
la $a0, ans1 #display first answer statement
li $v0, 4
syscall
mov.d $f12, $f0 #move x into f12 for display
li $v0, 2
syscall
la $a0, ans2 #print is
li $v0, 4
syscall
jal exp #otherwise jump and link to exp
mov.d $f12, $f0
li $v0, 2
syscall
j Loop
Exit:
la $a0, end #display closing statement
li $v0, 4
syscall
li $v0, 10 #exit the program
syscall
.data
wlcm: .asciiz "Let's test our exponential function! "
xreq: .asciiz "\nEnter a value for x (or 999 to exit): "
ans1: .asciiz "\nOur approximation for e^"
ans2: .asciiz " is "
end: .asciiz "Come back soon!"
lssthn: .float 1.0e-15
zero: .float 0.0
one: .float 1.0
two: .float 2.0
flag: .float 999.0