Арифметическое переполнение в расчете 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

0 ответов

Другие вопросы по тегам