#include #include #include #include #define NITERS 10000000 float finps[NITERS], foutps[NITERS]; double dinps[NITERS], doutps[NITERS]; int main () { struct rusage start_float_ru, end_float_ru; struct rusage start_double_ru, end_double_ru; int i; for (i = 0; i < NITERS; i++) dinps[i] = drand48() + 1e-6; for (i = 0; i < NITERS; i++) finps[i] = (float) (dinps[i]); getrusage (RUSAGE_SELF, &start_float_ru); for (i = 0; i < NITERS; i++) foutps[i] = expf (finps[i]); getrusage (RUSAGE_SELF, &end_float_ru); getrusage (RUSAGE_SELF, &start_double_ru); for (i = 0; i < NITERS; i++) doutps[i] = exp (dinps[i]); getrusage (RUSAGE_SELF, &end_double_ru); double fisum = 0; for (i = 0; i < NITERS; i++) fisum += finps[i]; double disum = 0; for (i = 0; i < NITERS; i++) disum += dinps[i]; double fosum = 0; for (i = 0; i < NITERS; i++) fosum += foutps[i]; double dosum = 0; for (i = 0; i < NITERS; i++) dosum += doutps[i]; printf ("fisum = %g, disum = %g\n", fisum, disum); printf ("fosum = %g, dosum = %g\n", fosum, dosum); printf ("float (expf) user time: %g sec\n", ((double)(end_float_ru.ru_utime.tv_sec - start_float_ru.ru_utime.tv_sec) +(double)(end_float_ru.ru_utime.tv_usec - start_float_ru.ru_utime.tv_usec) / 1.e6)); printf ("double (exp) user time: %g sec\n", ((double)(end_double_ru.ru_utime.tv_sec - start_double_ru.ru_utime.tv_sec) +(double)(end_double_ru.ru_utime.tv_usec - start_double_ru.ru_utime.tv_usec) / 1.e6)); return 0; }