Bench Signbit Check vs Float Check

Floats have a bit dedicated to if the value is a negative or not, I was wondering how much performance difference was checking the bit vs a function that compares against zero.

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>


#if 0
int
sign(float a) {
        return a >= 0.f ? 1 : 0;
}
#else
int
sign(float a) {
        return !((*(uint32_t*)&a >> 31) & 0xFF);
}
#endif


#define COUNT (1 << 13)


int main() {

        volatile int seed = 123;
        srand(seed);

        float data[COUNT] = {0};
        int i;

        for(i = 0; i < COUNT; ++i) {
                data[i] = ((float)(rand() % 1000) - 500.f) / 10000.f;
        }

        int result = 0;

        uint64_t start = __builtin_ia32_rdtsc();

        for(i = 0; i < COUNT; ++i) {
                result += sign(data[i]);
        }

        uint64_t end = __builtin_ia32_rdtsc();

        printf("Result: %d Time: %d\n", result, (int)(end - start));

        return 0;
}

build and go

cc signbit.c -O2 && ./a.out

Results

Signbit Check | Compare against Zero
--------------|---------------------
2211          | 2871

Signbit seems to win out in all cases, but this is small enough where we can really say there is no difference. Unless you have a use case which has you doing millions of these its really not going to be worth it.