| #include <windows.h> | 
 | #include <math.h> | 
 | #include <stdio.h> | 
 |  | 
 | typedef double (*my_pow)(double, double); | 
 |  | 
 | static my_pow fpow = pow; | 
 |  | 
 | static void set_pow_msvcrt(void) | 
 | { | 
 |   HMODULE hMod = LoadLibrary ("msvcrt.dll"); | 
 |   fpow = (my_pow) GetProcAddress (hMod, "pow"); | 
 | } | 
 |  | 
 | static __attribute__((noinline)) double pow_by_log_exp (double x, double y) | 
 | { | 
 |   /* pow(x, n) = exp(n * log(x)) */ | 
 |   if (x < 0.0) | 
 |   { | 
 |     long v = (long) y; | 
 |     x = exp(y * log (-x)); | 
 |     if ((double) v == y && (v&1) != 0) | 
 | 	{ | 
 | 	  x = -x; | 
 | 	} | 
 |     return x; | 
 |   } | 
 |   return exp(y * log(x)); | 
 | } | 
 |  | 
 | static __attribute__((noinline)) void test(int cnt) | 
 | { | 
 |   double x, y, z; | 
 |   unsigned int tiS = GetTickCount(); | 
 |   x = 1.0; | 
 |   y = 1.0; | 
 |   z = 0.0; | 
 |   while (cnt > 0) | 
 |   { | 
 |    x += 0.01; | 
 |    y -= 0.01; | 
 |    z += (*fpow)(x, y); | 
 |    --cnt; | 
 |   } | 
 |   printf ("Rslt: %g, %u ms\n", z, GetTickCount () - tiS); | 
 | } | 
 |  | 
 | int main (int argc, char **argv) | 
 | { | 
 |   int e = (argc > 1 ? atoi(argv[1]) : 20000000); | 
 |   printf ("Current implementation in libmingwex: "); | 
 |   test (e); | 
 |   printf ("pow(-1.0, 2) = %g\n", (*fpow)(-1.0, 2.0)); | 
 |   printf ("pow(-1.0, 2.2) = %g\n", (*fpow)(-1.0, 2.2)); | 
 |   printf ("pow(2.0, -1) = %g\n", (*fpow)(2.0,-1.0)); | 
 |   set_pow_msvcrt (); | 
 |   printf ("Implementation in msvcrt.dll: "); | 
 |   test (e); | 
 |   printf ("pow(-1.0, 2) = %g\n", (*fpow)(-1.0, 2.0)); | 
 |   printf ("pow(-1.0, 2.2) = %g\n", (*fpow)(-1.0, 2.2)); | 
 |   printf ("pow(2.0, -1) = %g\n", (*fpow)(2.0,-1.0)); | 
 |   fpow = pow_by_log_exp; | 
 |   printf ("Implementation by exp and log: "); | 
 |   test (e); | 
 |   printf ("pow(-1.0, 2) = %g\n", (*fpow)(-1.0, 2.0)); | 
 |   printf ("pow(-1.0, 2.2) = %g\n", (*fpow)(-1.0, 2.2)); | 
 |   printf ("pow(2.0, -1) = %g\n", (*fpow)(2.0,-1.0)); | 
 |   return 0; | 
 | } | 
 |  |