#include <math.h>
#include <stdint.h>

float hypotf(float x, float y)
{
    union
    {
        float f;
        uint32_t i;
    } ux = {x}, uy = {y}, ut;
    float_t z;

    ux.i &= -1U >> 1;
    uy.i &= -1U >> 1;
    if (ux.i < uy.i)
    {
        ut = ux;
        ux = uy;
        uy = ut;
    }

    x = ux.f;
    y = uy.f;
    if (uy.i == 0xff << 23)
        return y;
    if (ux.i >= 0xff << 23 || uy.i == 0 || ux.i - uy.i >= 25 << 23)
        return x + y;

    z = 1;
    if (ux.i >= (0x7f + 60) << 23)
    {
        z = 0x1p90f;
        x *= 0x1p-90f;
        y *= 0x1p-90f;
    }
    else if (uy.i < (0x7f - 60) << 23)
    {
        z = 0x1p-90f;
        x *= 0x1p90f;
        y *= 0x1p90f;
    }
    return z * sqrtf((double)x * x + (double)y * y);
}
