#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;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgpmbG9hdCBtYWtlX2Zsb2F0KHVpbnQzMl90IHJhbmRvbTIzKQp7CiAgICB1aW50MzJfdCBwYXR0ZXJuID0gMHgzZjgwMDAwMDsKCiAgICByYW5kb20yMyAmPSAweDdmZmZmZjsKICAgIHBhdHRlcm4gfD0gcmFuZG9tMjM7CgogICAgYXNzZXJ0KHNpemVvZihmbG9hdCkgPT0gc2l6ZW9mKHVpbnQzMl90KSk7CiAgICBjaGFyIGJ1ZmZlcltzaXplb2YoZmxvYXQpXTsKICAgIG1lbWNweShidWZmZXIsICZwYXR0ZXJuLCBzaXplb2YoZmxvYXQpKTsKICAgIGZsb2F0IGY7CiAgICBtZW1jcHkoJmYsIGJ1ZmZlciwgc2l6ZW9mKGZsb2F0KSk7CgogICAgcmV0dXJuIGYgLSAxLjA7Cn0KCmZsb2F0IG1ha2VfZmxvYXQyKHVpbnQzMl90IHJhbmRvbTIzKQp7CiAgICByYW5kb20yMyAmPSAweDdmZmZmZjsKICAgIHJldHVybiAoZmxvYXQpcmFuZG9tMjMgLyAoMSA8PCAyMyk7Cn0KCmludCBtYWluKHZvaWQpIHsKICAgIGZvciAodWludDMyX3QgaSA9IDA7IChpID4+IDIzKSA8IDE7IGkrKykgewogICAgICAgIGZsb2F0IGEgPSBtYWtlX2Zsb2F0KGkpLCBiID0gbWFrZV9mbG9hdDIoaSk7CiAgICAgICAgaWYgKGEgIT0gYikgewogICAgICAgICAgICBwcmludGYoIk1pc21hdGNoOiAlZCAtPiAlLjIwZiAhPSAlLjIwZiFcbiIsIGksIGEsIGIpOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9CiAgICBwcmludGYoIk5vIG1pc21hdGNoIGZvdW5kLlxuIik7CiAgICByZXR1cm4gMDsKfQo=