#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <assert.h>

float make_float(uint32_t random23)
{
    uint32_t pattern = 0x3f800000;

    random23 &= 0x7fffff;
    pattern |= random23;

    assert(sizeof(float) == sizeof(uint32_t));
    char buffer[sizeof(float)];
    memcpy(buffer, &pattern, sizeof(float));
    float f;
    memcpy(&f, buffer, sizeof(float));

    return f - 1.0;
}

float make_float2(uint32_t random23)
{
    random23 &= 0x7fffff;
    return (float)random23 / (1 << 23);
}

int main(void) {
    for (uint32_t i = 0; (i >> 23) < 1; i++) {
        float a = make_float(i), b = make_float2(i);
        if (a != b) {
            printf("Mismatch: %d -> %.20f != %.20f!\n", i, a, b);
            return 1;
        }
    }
    printf("No mismatch found.\n");
    return 0;
}
