Advertisement
Guest User

Untitled

a guest
Dec 6th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 2.24 KB | None | 0 0
  1. #
  2. # Philipp Schaback
  3. # Mat. Nr. 1975106
  4. #
  5. #
  6. # Vorbemerkuung:
  7. # Da Floatoperationen im Allgemeinen als "teuer" angesehen werden, wurde die Bailey-Borwein-Plouffe-Formel
  8. # auf wenigere FLoatoperationen reduziert. Die dabei enstandene Formel kann der Rückseite des au
  9. #
  10. .data
  11. pi: .asciiz "Pi: "
  12. nl: .asciiz "\n"
  13. zero: .double 0.0
  14. one: .double 1.0
  15. sixteen: .double 16.0
  16. .text
  17. .globl main
  18. main:   li $t0, 0           # Schleifenzähler initialisieren
  19.     li $t1, 10          # Maximum initialisieren
  20.     l.d $f8, sixteen        # Konstant 16 initialisieren
  21.     l.d $f10 one            # 16er Bruch initialisieren
  22.     l.d $f12, zero          # Ergebnisregister initialisieren
  23. loop:   li $t2, 0           # Zähler des großen Bruchs initialisieren
  24.     li $t3, 1           # Nenner des großen Bruchs initialisieren
  25.    
  26.     li $t4, 120         # 120k^2 berechnen und auf Zähler addieren
  27.     mul $t4, $t4, $t0
  28.     mul $t4, $t4, $t0
  29.     add $t2, $t2, $t4
  30.    
  31.     li $t4, 151         # 151k berechnen und auf Zähler addieren
  32.     mul $t4, $t4, $t0
  33.     add $t2, $t2, $t4
  34.    
  35.     addiu $t2, $t2, 47      # 47 auf Zähler addieren
  36.    
  37.     move $t4, $t0           # (2k+1) berechnen und an den Nenner multiplizieren
  38.     sll $t4, $t4, 1
  39.     addiu, $t4, $t4, 1
  40.     mul $t3, $t3, $t4
  41.    
  42.     move $t4, $t0           # (4k+3) berechnen und an den Nenner multiplizieren
  43.     sll $t4, $t4, 2
  44.     addiu, $t4, $t4, 3
  45.     mul $t3, $t3, $t4
  46.    
  47.     move $t4, $t0           # (8k+1) berechnen und an den Nenner multiplizieren
  48.     sll $t4, $t4, 3
  49.     addiu, $t4, $t4, 1
  50.     mul $t3, $t3, $t4
  51.    
  52.     move $t4, $t0           # (8k+5) berechnen und an den Nenner multiplizieren
  53.     sll $t4, $t4, 3
  54.     addiu, $t4, $t4, 5
  55.     mul $t3, $t3, $t4
  56.    
  57.     mtc1 $t2, $f0           # Zähler in den Koprozessor laden
  58.     cvt.d.w $f0, $f0        # Zähler auf Double konvertieren
  59.     mtc1 $t3, $f2           # Nenner in den Koprozessor laden
  60.     cvt.d.w $f2, $f2        # Nenner auf Double konvertieren
  61.     div.d $f4, $f0, $f2     # Zähler durch Nenner teilen und Bruch in $f4 speichern
  62.    
  63.     mul.d $f4, $f4, $f10        # 16er Bruch mit großem Bruch multiplizieren
  64.    
  65.     add.d $f12, $f12, $f4       # Auf die Gesamtsumme addieren
  66.    
  67.     addiu $t0, $t0, 1       # Schleifenzähler erhöhen
  68.    
  69.     div.d $f10, $f10, $f8       # 16er Bruch durch 16 teilen
  70.    
  71.     ble $t0, $t1, loop      # Für 0..10 wiederholen
  72.    
  73.     li $v0, 4           # Ausgabe und beenden
  74.     la $a0, pi
  75.     syscall
  76.     li $v0, 3
  77.     syscall
  78.     li $v0, 4
  79.     la $a0, nl
  80.     syscall
  81.     li $v0, 10
  82.     syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement