Wydanie R2019.06.1
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
fpu: fpu.c arctg.s
|
||||
gcc -g fpu.c arctg.s -o fpu -no-pie -lm
|
||||
|
||||
|
||||
all: fpu
|
||||
|
||||
clean:
|
||||
rm -f fpu
|
||||
@@ -0,0 +1,62 @@
|
||||
# Jan Potocki 2019
|
||||
# Szereg Taylora arctg(x) dla |x| < 1
|
||||
# y = (-1)^n * (x^(2n + 1)) / (2n + 1)
|
||||
|
||||
.globl arctg
|
||||
.type arctg, @function
|
||||
|
||||
arctg:
|
||||
pushq %rbp # Wejscie do funkcji
|
||||
movq %rsp, %rbp
|
||||
subq $8, %rsp # 64-bit double - tymczasowe miejsce w pamieci na x
|
||||
subq $4, %rsp # 32-bit int - tymczasowe miejsce w pamieci na 2n+1
|
||||
|
||||
# Przygotowanie danych
|
||||
vmovsd %xmm0, -8(%rbp) # Umieszczenie w pamieci argumentu funkcji
|
||||
movq $0, %r8 # r8 - indeks sumy (n), na razie wyzerowany...
|
||||
fldz # Umieszczenie 0 na stosie FPU (do sumowania szeregu)
|
||||
|
||||
szereg:
|
||||
# Glowna petla
|
||||
incq %r8 # ...trzeba zliczac od 1, indeks jest argumentem ciagu
|
||||
|
||||
# Obliczenie 2n+1
|
||||
movq $2, %rax
|
||||
mulq %r8
|
||||
incq %rax
|
||||
movl %eax, -12(%rbp) # Zapisanie wyniku 2n+1 w pamieci
|
||||
|
||||
# Potegowanie (iteracyjne)
|
||||
fldl -8(%rbp) # Umieszczenie na stosie FPU poczatkowej wartosci
|
||||
movq $1, %r9 # r9 - zliczanie wykladnika (zaczynamy od 1. potegi)
|
||||
|
||||
potega:
|
||||
fmull -8(%rbp) # Mnozenie st(0) przez podstawe potegi (w pamieci)
|
||||
incq %r9 # Aktualizacja wykladnika
|
||||
cmpq %r9, %rax # Sprawdzenie czy wykladnik 2n+1 zostal osiagniety
|
||||
jne potega
|
||||
|
||||
# Dzielenie
|
||||
fidivl -12(%rbp)
|
||||
|
||||
# Sprawdzenie parzystosci wykladnika w (-1)^n
|
||||
movq $0, %rdx # rdx - starsza polowka bitow dzielnej
|
||||
movq %r8, %rax # rax - mlodsza polowka bitow dzielnej
|
||||
movq $2, %rcx # rcx - dzielnik
|
||||
divq %rcx
|
||||
cmpq $1, %rdx # rdx - reszta z dzielenia
|
||||
jne suma # Reszta 0 -> wykladnik parzysty, jest OK
|
||||
fchs # Reszta 1 -> wykladnik nieparzysty, potrzebny minus
|
||||
|
||||
suma:
|
||||
faddp # st(1) - poprzednia iteracja, st(0) - aktualna
|
||||
|
||||
cmpq %r8, %rdi # Sprawdzenie czy wyraz szeregu zostal osiagniety
|
||||
jne szereg
|
||||
|
||||
fstl -8(%rbp) # Zapisanie wyniku w pamieci...
|
||||
movsd -8(%rbp), %xmm0 # i zwrocenie w xmm0 (bezposrednio sie nie da)
|
||||
|
||||
addq $12, %rsp # Zwolnienie zmiennych lokalnych
|
||||
popq %rbp # Wyjscie z funkcji
|
||||
ret
|
||||
@@ -0,0 +1,26 @@
|
||||
// Jan Potocki 2019
|
||||
|
||||
#include <math.h>
|
||||
|
||||
double arctgc(double x, int kroki)
|
||||
{
|
||||
int wyraz, i;
|
||||
double potega, wynik;
|
||||
double suma = 0;
|
||||
|
||||
for(i = 1; i <= kroki; i++)
|
||||
{
|
||||
wyraz = 2*i + 1;
|
||||
potega = pow(x, (double)wyraz);
|
||||
wynik = potega/(double)wyraz;
|
||||
|
||||
if(i % 2 == 1)
|
||||
{
|
||||
wynik = -wynik;
|
||||
}
|
||||
|
||||
suma += wynik;
|
||||
}
|
||||
|
||||
return suma;
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
// Jan Potocki 2019
|
||||
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include "arctgc.c"
|
||||
|
||||
double arctg(double x, int kroki);
|
||||
|
||||
const double x = 0.5;
|
||||
const int n = 100;
|
||||
|
||||
int main()
|
||||
{
|
||||
double wynik_asm, wynik_c;
|
||||
|
||||
printf("Szereg Taylora arctg(%f) dla n=%d...\n", x, n);
|
||||
|
||||
wynik_asm = arctg(x, n);
|
||||
wynik_c = arctgc(x, n);
|
||||
|
||||
printf("Wynik asm:\t%f\n", wynik_asm);
|
||||
printf("Wynik C:\t%f\n", wynik_c);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user