#define _ISOC99_SOURCE #include #include #include #include #define ITER 250000 double fp(double frac, int divs) { double i; double n; i = log2(divs) + 1; n = frac; while (i && n > floor(n)) { i--; n *= 2.0; } return i; } double mod(double frac, int divs) { int x, n; x = frac * divs; for (n = divs; n > 0; n >>= 1) { if ((x % n) == 0) return log2((double)n) + 1.0; } return 0.0; } int integer(double frac, int divs) { int i, m, n; i = log2(divs) + 1; m = (1 << (i - 1)) - 1; n = frac * divs; while (i && (n & m)) { i--; m >>= 1; } return i; } long utime_sub(struct timeval first, struct timeval last) { return ((last.tv_sec - first.tv_sec) * 1000000) + (last.tv_usec - first.tv_usec); } int main(int argc, char *argv[]) { struct timeval start, end; int x, y; for (x = 0; x < 16; x++) { printf("%.0f ", fp((double)x / 16.0, 16)); } printf("\n"); for (x = 0; x < 16; x++) { printf("%.0f ", mod((double)x / 16.0, 16)); } printf("\n"); for (x = 0; x < 16; x++) { printf("%d ", integer((double)x / 16.0, 16)); } printf("\n"); gettimeofday(&start, NULL); for (y = 0; y < ITER; y++) { for (x = 0; x < 16; x++) fp((double)x / 8.0, 8); } gettimeofday(&end, NULL); printf("fp : %ld us\n", utime_sub(start, end)); gettimeofday(&start, NULL); for (y = 0; y < ITER; y++) { for (x = 0; x < 16; x++) mod((double)x / 8.0, 8); } gettimeofday(&end, NULL); printf("mod: %ld us\n", utime_sub(start, end)); gettimeofday(&start, NULL); for (y = 0; y < ITER; y++) { for (x = 0; x < 16; x++) integer((double)x / 8.0, 8); } gettimeofday(&end, NULL); printf("int: %ld us\n", utime_sub(start, end)); return 0; }