/**
* sincos.c
*
* Demo für sincos direkt auf einer x86 FPU,
*
* gcc sincos.c
*
* $ ./a.out
* .4
* sincos(0.40000000000000002) -> sin: 0.38941834230865052 cos: 0.92106099400288510
*
*/
#include <stdio.h>
void static inline X86FpuSincos(double *a, double *y, double *x){
asm ("fldl %[a] \n\t" // Winkel auf den Register-Stack der FPU
"fsincos \n\t" // sin und cos mit einem Befehl in der FPU erzeugen
"fstpl %[x] \n\t" // Kosinus aus der FPU in die Variable schreiben
"fstpl %[y]" // Sinus aus der FPU in die Variable schreiben
:[x] "=m" (*x) , [y] "=m" (*y) // x und y im Assembler als Ausgabe definieren
:[a] "m" (*a) // a im Assembler als Eingabe definieren
);
}
int main(){
double y; // Sinus
double x; // Kosinus
double a; // Winkel
scanf ("%lf", &a); // Winkel einlesen
X86FpuSincos (&a, &y, &x);
printf ("sincos(%.17lf) -> sin: %.17lf cos: %.17lf\n", a, y, x); // alles ausgeben
}
Comments
0 B
|👍
/👎