/** * 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 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 }