root/regress/lib/libm/modf/modf_test.c
/*      $OpenBSD: modf_test.c,v 1.1 2023/08/13 07:02:36 miod Exp $      */

/*
 * Written by Willemijn Coene.  Public domain
 */

#include <assert.h>
#include <math.h>

void
modff_infnan(void)
{
        float f, i;

        f = modff(__builtin_inff(), &i);
        assert(isinf(i));
        assert(signbit(i) == 0);
        assert(f == 0.0f);

        f = modff(-__builtin_inff(), &i);
        assert(isinf(i));
        assert(signbit(i) != 0);
        assert(f == -0.0f);

        f = modff(NAN, &i);
        assert(isnan(i));
        assert(signbit(i) == 0);
        assert(isnan(f));
        assert(signbit(f) == 0);

        f = modff(-NAN, &i);
        assert(isnan(i));
        assert(signbit(i) != 0);
        assert(isnan(f));
        assert(signbit(f) != 0);
}

void
modfl_infnan(void)
{
        long double f, i;

        f = modfl(__builtin_infl(), &i);
        assert(isinf(i));
        assert(signbit(i) == 0);
        assert(f == 0.0L);

        f = modfl(-__builtin_infl(), &i);
        assert(isinf(i));
        assert(signbit(i) != 0);
        assert(f == -0.0L);

        f = modfl(NAN, &i);
        assert(isnan(i));
        assert(signbit(i) == 0);
        assert(isnan(f));
        assert(signbit(f) == 0);

        f = modfl(-NAN, &i);
        assert(isnan(i));
        assert(signbit(i) != 0);
        assert(isnan(f));
        assert(signbit(f) != 0);
}

int
main(void)
{
        modff_infnan();
        modfl_infnan();
}