HelenOS sources

root/uspace/lib/math/test/rounding.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. fint
  2. dint
  3. PCUT_TEST
  4. PCUT_TEST
  5. PCUT_TEST
  6. PCUT_TEST
  7. PCUT_TEST
  8. PCUT_TEST
  9. PCUT_TEST

/*
 * Copyright (c) 2018 CZ.NIC, z.s.p.o.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - The name of the author may not be used to endorse or promote products
 *   derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include <pcut/pcut.h>
#include <math.h>
#include <inttypes.h>
#include <float.h>

PCUT_INIT;

PCUT_TEST_SUITE(rounding);

static inline uint32_t fint(float x)
{
        union {
                float f;
                uint32_t i;
        } u = { .f = x };
        return u.i;
}

static inline uint64_t dint(double x)
{
        union {
                double f;
                uint64_t i;
        } u = { .f = x };
        return u.i;
}

#define assert_float_equals(x, y) PCUT_ASSERT_EQUALS(fint(x), fint(y))
#define assert_double_equals(x, y) PCUT_ASSERT_EQUALS(dint(x), dint(y))

#define FLOAT_CASES 200
#define DOUBLE_CASES 0

static float float_arguments[FLOAT_CASES] = {
        HUGE_VALF,
        -HUGE_VALF,
        __builtin_nanf(""),
        -__builtin_nanf(""),
        __builtin_nanf("0xdeadbe"),
        -__builtin_nanf("0xdeadbe"),

        0x0.000000p0f,       /* zero */
        0x0.000002p-126f,    /* smallest denormal > 0 */
        0x1.000000p-126f,    /* smallest normal > 0 */
        0x1.fffffep-2f,      /* largest < 0.5 */
        0x1.000000p-1f,      /* 0.5 */
        0x1.000002p-1f,      /* smallest > 0.5 */
        0x1.fffffep-1f,      /* largest < 1 */
        0x1.000000p0f,       /* 1 */
        0x1.000002p0f,       /* smallest > 1 */
        0x1.7ffffep0f,       /* largest < 1.5 */
        0x1.800000p0f,       /* 1.5 */
        0x1.800002p0f,       /* smallest > 1.5 */
        0x1.fffffep0f,       /* largest < 2 */
        0x1.000000p1f,       /* 2 */
        0x1.000002p1f,       /* smallest > 2 */
        0x1.3ffffep1f,       /* largest < 2.5 */
        0x1.400000p1f,       /* 2.5 */
        0x1.400002p1f,       /* smallest > 2.5 */
        0x1.7ffffep1f,       /* largest < 3 */
        0x1.800000p1f,       /* 3 */
        0x1.800002p1f,       /* smallest > 3 */
        0x1.bffffep1f,       /* largest < 3.5 */
        0x1.c00000p1f,       /* 3.5 */
        0x1.c00002p1f,       /* smallest > 3.5 */
        0x1.fffffep1f,       /* largest < 4 */
        0x1.000000p2f,       /* 4 */
        0x1.000002p2f,       /* smallest > 4 */

        0x1.ffffe0p20f,      /* 2^21 - 2 */
        0x1.ffffe2p20f,      /* 2^21 - 1.875 */
        0x1.ffffe4p20f,      /* 2^21 - 1.75 */
        0x1.ffffe6p20f,      /* 2^21 - 1.625 */
        0x1.ffffe8p20f,      /* 2^21 - 1.5 */
        0x1.ffffeap20f,      /* 2^21 - 1.375 */
        0x1.ffffecp20f,      /* 2^21 - 1.25 */
        0x1.ffffeep20f,      /* 2^21 - 1.125 */
        0x1.fffff0p20f,      /* 2^21 - 1 */
        0x1.fffff2p20f,      /* 2^21 - 0.875 */
        0x1.fffff4p20f,      /* 2^21 - 0.75 */
        0x1.fffff6p20f,      /* 2^21 - 0.625 */
        0x1.fffff8p20f,      /* 2^21 - 0.5 */
        0x1.fffffap20f,      /* 2^21 - 0.375 */
        0x1.fffffcp20f,      /* 2^21 - 0.25 */
        0x1.fffffep20f,      /* 2^21 - 0.125 */
        0x1.000000p21f,      /* 2^21 */
        0x1.000002p21f,      /* 2^21 + 0.25 */
        0x1.000004p21f,      /* 2^21 + 0.5 */
        0x1.000006p21f,      /* 2^21 + 0.75 */
        0x1.000008p21f,      /* 2^21 + 1 */
        0x1.00000ap21f,      /* 2^21 + 1.25 */
        0x1.00000cp21f,      /* 2^21 + 1.5 */
        0x1.00000ep21f,      /* 2^21 + 1.75 */
        0x1.000010p21f,      /* 2^21 + 2 */

        0x1.fffff0p21f,      /* 2^22 - 2 */
        0x1.fffff2p21f,      /* 2^22 - 1.75 */
        0x1.fffff4p21f,      /* 2^22 - 1.5 */
        0x1.fffff6p21f,      /* 2^22 - 1.25 */
        0x1.fffff8p21f,      /* 2^22 - 1 */
        0x1.fffffap21f,      /* 2^22 - 0.75 */
        0x1.fffffcp21f,      /* 2^22 - 0.5 */
        0x1.fffffep21f,      /* 2^22 - 0.25 */
        0x1.000000p22f,      /* 2^22 */
        0x1.000002p22f,      /* 2^22 + 0.5 */
        0x1.000004p22f,      /* 2^22 + 1 */
        0x1.000006p22f,      /* 2^22 + 1.5 */
        0x1.000008p22f,      /* 2^22 + 2 */

        0x1.fffff0p22f,      /* 2^23 - 4 */
        0x1.fffff2p22f,      /* 2^23 - 3.5 */
        0x1.fffff4p22f,      /* 2^23 - 3 */
        0x1.fffff6p22f,      /* 2^23 - 2.5 */
        0x1.fffff8p22f,      /* 2^23 - 2 */
        0x1.fffffap22f,      /* 2^23 - 1.5 */
        0x1.fffffcp22f,      /* 2^23 - 1 */
        0x1.fffffep22f,      /* 2^23 - 0.5 */
        0x1.000000p23f,      /* 2^23 */
        0x1.000002p23f,      /* 2^23 + 1 */
        0x1.000004p23f,      /* 2^23 + 2 */
        0x1.000006p23f,      /* 2^23 + 3 */
        0x1.000008p23f,      /* 2^23 + 4 */

        0x1.fffff0p23f,      /* 2^24 - 8 */
        0x1.fffff2p23f,      /* 2^24 - 7 */
        0x1.fffff4p23f,      /* 2^24 - 6 */
        0x1.fffff6p23f,      /* 2^24 - 5 */
        0x1.fffff8p23f,      /* 2^24 - 4 */
        0x1.fffffap23f,      /* 2^24 - 3 */
        0x1.fffffcp23f,      /* 2^24 - 2 */
        0x1.fffffep23f,      /* 2^24 - 1 */
        0x1.000000p24f,      /* 2^24 */
        0x1.000002p24f,      /* 2^24 + 2 */
        0x1.000004p24f,      /* 2^24 + 4 */
        0x1.000006p24f,      /* 2^24 + 6 */
        0x1.000008p24f,      /* 2^24 + 8 */

        0x1.fffffep100f,     /* large integer */

        /* Same as above but negative */

        -0x0.000000p0f,       /* zero */
        -0x0.000002p-126f,    /* smallest denormal > 0 */
        -0x1.000000p-126f,    /* smallest normal > 0 */
        -0x1.fffffep-2f,      /* largest < 0.5 */
        -0x1.000000p-1f,      /* 0.5 */
        -0x1.000002p-1f,      /* smallest > 0.5 */
        -0x1.fffffep-1f,      /* largest < 1 */
        -0x1.000000p0f,       /* 1 */
        -0x1.000002p0f,       /* smallest > 1 */
        -0x1.7ffffep0f,       /* largest < 1.5 */
        -0x1.800000p0f,       /* 1.5 */
        -0x1.800002p0f,       /* smallest > 1.5 */
        -0x1.fffffep0f,       /* largest < 2 */
        -0x1.000000p1f,       /* 2 */
        -0x1.000002p1f,       /* smallest > 2 */
        -0x1.3ffffep1f,       /* largest < 2.5 */
        -0x1.400000p1f,       /* 2.5 */
        -0x1.400002p1f,       /* smallest > 2.5 */
        -0x1.7ffffep1f,       /* largest < 3 */
        -0x1.800000p1f,       /* 3 */
        -0x1.800002p1f,       /* smallest > 3 */
        -0x1.bffffep1f,       /* largest < 3.5 */
        -0x1.c00000p1f,       /* 3.5 */
        -0x1.c00002p1f,       /* smallest > 3.5 */
        -0x1.fffffep1f,       /* largest < 4 */
        -0x1.000000p2f,       /* 4 */
        -0x1.000002p2f,       /* smallest > 4 */

        -0x1.ffffe0p20f,      /* 2^21 - 2 */
        -0x1.ffffe2p20f,      /* 2^21 - 1.875 */
        -0x1.ffffe4p20f,      /* 2^21 - 1.75 */
        -0x1.ffffe6p20f,      /* 2^21 - 1.625 */
        -0x1.ffffe8p20f,      /* 2^21 - 1.5 */
        -0x1.ffffeap20f,      /* 2^21 - 1.375 */
        -0x1.ffffecp20f,      /* 2^21 - 1.25 */
        -0x1.ffffeep20f,      /* 2^21 - 1.125 */
        -0x1.fffff0p20f,      /* 2^21 - 1 */
        -0x1.fffff2p20f,      /* 2^21 - 0.875 */
        -0x1.fffff4p20f,      /* 2^21 - 0.75 */
        -0x1.fffff6p20f,      /* 2^21 - 0.625 */
        -0x1.fffff8p20f,      /* 2^21 - 0.5 */
        -0x1.fffffap20f,      /* 2^21 - 0.375 */
        -0x1.fffffcp20f,      /* 2^21 - 0.25 */
        -0x1.fffffep20f,      /* 2^21 - 0.125 */
        -0x1.000000p21f,      /* 2^21 */
        -0x1.000002p21f,      /* 2^21 + 0.25 */
        -0x1.000004p21f,      /* 2^21 + 0.5 */
        -0x1.000006p21f,      /* 2^21 + 0.75 */
        -0x1.000008p21f,      /* 2^21 + 1 */
        -0x1.00000ap21f,      /* 2^21 + 1.25 */
        -0x1.00000cp21f,      /* 2^21 + 1.5 */
        -0x1.00000ep21f,      /* 2^21 + 1.75 */
        -0x1.000010p21f,      /* 2^21 + 2 */

        -0x1.fffff0p21f,      /* 2^22 - 2 */
        -0x1.fffff2p21f,      /* 2^22 - 1.75 */
        -0x1.fffff4p21f,      /* 2^22 - 1.5 */
        -0x1.fffff6p21f,      /* 2^22 - 1.25 */
        -0x1.fffff8p21f,      /* 2^22 - 1 */
        -0x1.fffffap21f,      /* 2^22 - 0.75 */
        -0x1.fffffcp21f,      /* 2^22 - 0.5 */
        -0x1.fffffep21f,      /* 2^22 - 0.25 */
        -0x1.000000p22f,      /* 2^22 */
        -0x1.000002p22f,      /* 2^22 + 0.5 */
        -0x1.000004p22f,      /* 2^22 + 1 */
        -0x1.000006p22f,      /* 2^22 + 1.5 */
        -0x1.000008p22f,      /* 2^22 + 2 */

        -0x1.fffff0p22f,      /* 2^23 - 4 */
        -0x1.fffff2p22f,      /* 2^23 - 3.5 */
        -0x1.fffff4p22f,      /* 2^23 - 3 */
        -0x1.fffff6p22f,      /* 2^23 - 2.5 */
        -0x1.fffff8p22f,      /* 2^23 - 2 */
        -0x1.fffffap22f,      /* 2^23 - 1.5 */
        -0x1.fffffcp22f,      /* 2^23 - 1 */
        -0x1.fffffep22f,      /* 2^23 - 0.5 */
        -0x1.000000p23f,      /* 2^23 */
        -0x1.000002p23f,      /* 2^23 + 1 */
        -0x1.000004p23f,      /* 2^23 + 2 */
        -0x1.000006p23f,      /* 2^23 + 3 */
        -0x1.000008p23f,      /* 2^23 + 4 */

        -0x1.fffff0p23f,      /* 2^24 - 8 */
        -0x1.fffff2p23f,      /* 2^24 - 7 */
        -0x1.fffff4p23f,      /* 2^24 - 6 */
        -0x1.fffff6p23f,      /* 2^24 - 5 */
        -0x1.fffff8p23f,      /* 2^24 - 4 */
        -0x1.fffffap23f,      /* 2^24 - 3 */
        -0x1.fffffcp23f,      /* 2^24 - 2 */
        -0x1.fffffep23f,      /* 2^24 - 1 */
        -0x1.000000p24f,      /* 2^24 */
        -0x1.000002p24f,      /* 2^24 + 2 */
        -0x1.000004p24f,      /* 2^24 + 4 */
        -0x1.000006p24f,      /* 2^24 + 6 */
        -0x1.000008p24f,      /* 2^24 + 8 */

        -0x1.fffffep100f,     /* large integer with full mantissa */

        /* a few random numbers */
        3.5, -2.1, 100.0, 50.0, -1024.0, 0.0, 768.3156, 1080.499999, -600.0, 1.0
};

static float float_identity[FLOAT_CASES] = {
        HUGE_VALF,
        -HUGE_VALF,
        __builtin_nanf(""),
        -__builtin_nanf(""),
        __builtin_nanf("0xdeadbe"),
        -__builtin_nanf("0xdeadbe"),

        0.0,
        FLT_TRUE_MIN,    /* smallest denormal > 0 */
        FLT_MIN,         /* smallest normal > 0 */
        0.5 - (FLT_EPSILON / 4.),
        0.5,
        0.5 + (FLT_EPSILON / 2.),
        1.0 - (FLT_EPSILON / 2.),
        1.0,
        1.0 + FLT_EPSILON,
        1.5 - FLT_EPSILON,
        1.5,
        1.5 + FLT_EPSILON,
        2.0 - FLT_EPSILON,
        2.0,
        2.0 + (2.0 * FLT_EPSILON),
        2.5 - (2.0 * FLT_EPSILON),
        2.5,
        2.5 + (2.0 * FLT_EPSILON),
        3.0 - (2.0 * FLT_EPSILON),
        3.0,
        3.0 + (2.0 * FLT_EPSILON),
        3.5 - (2.0 * FLT_EPSILON),
        3.5,
        3.5 + (2.0 * FLT_EPSILON),
        4.0 - (2.0 * FLT_EPSILON),
        4.0,
        4.0 + (4.0 * FLT_EPSILON),

        2097150.000,     /* 2^21 - 2 */
        2097150.125,     /* 2^21 - 1.875 */
        2097150.250,     /* 2^21 - 1.75 */
        2097150.375,     /* 2^21 - 1.625 */
        2097150.500,     /* 2^21 - 1.5 */
        2097150.625,     /* 2^21 - 1.375 */
        2097150.750,     /* 2^21 - 1.25 */
        2097150.875,     /* 2^21 - 1.125 */
        2097151.000,     /* 2^21 - 1 */
        2097151.125,     /* 2^21 - 0.875 */
        2097151.250,     /* 2^21 - 0.75 */
        2097151.375,     /* 2^21 - 0.625 */
        2097151.500,     /* 2^21 - 0.5 */
        2097151.625,     /* 2^21 - 0.375 */
        2097151.750,     /* 2^21 - 0.25 */
        2097151.875,     /* 2^21 - 0.125 */
        2097152.00,      /* 2^21 */
        2097152.25,      /* 2^21 + 0.25 */
        2097152.50,      /* 2^21 + 0.5 */
        2097152.75,      /* 2^21 + 0.75 */
        2097153.00,      /* 2^21 + 1 */
        2097153.25,      /* 2^21 + 1.25 */
        2097153.50,      /* 2^21 + 1.5 */
        2097153.75,      /* 2^21 + 1.75 */
        2097154.00,      /* 2^21 + 2 */

        4194302.00,      /* 2^22 - 2 */
        4194302.25,      /* 2^22 - 1.75 */
        4194302.50,      /* 2^22 - 1.5 */
        4194302.75,      /* 2^22 - 1.25 */
        4194303.00,      /* 2^22 - 1 */
        4194303.25,      /* 2^22 - 0.75 */
        4194303.50,      /* 2^22 - 0.5 */
        4194303.75,      /* 2^22 - 0.25 */
        4194304.0,       /* 2^22 */
        4194304.5,       /* 2^22 + 0.5 */
        4194305.0,       /* 2^22 + 1 */
        4194305.5,       /* 2^22 + 1.5 */
        4194306.0,       /* 2^22 + 2 */

        8388604.0,      /* 2^23 - 4 */
        8388604.5,      /* 2^23 - 3.5 */
        8388605.0,      /* 2^23 - 3 */
        8388605.5,      /* 2^23 - 2.5 */
        8388606.0,      /* 2^23 - 2 */
        8388606.5,      /* 2^23 - 1.5 */
        8388607.0,      /* 2^23 - 1 */
        8388607.5,      /* 2^23 - 0.5 */
        8388608.0,      /* 2^23 */
        8388609.0,      /* 2^23 + 1 */
        8388610.0,      /* 2^23 + 2 */
        8388611.0,      /* 2^23 + 3 */
        8388612.0,      /* 2^23 + 4 */

        16777208.0,      /* 2^24 - 8 */
        16777209.0,      /* 2^24 - 7 */
        16777210.0,      /* 2^24 - 6 */
        16777211.0,      /* 2^24 - 5 */
        16777212.0,      /* 2^24 - 4 */
        16777213.0,      /* 2^24 - 3 */
        16777214.0,      /* 2^24 - 2 */
        16777215.0,      /* 2^24 - 1 */
        16777216.0,      /* 2^24 */
        16777218.0,      /* 2^24 + 2 */
        16777220.0,      /* 2^24 + 4 */
        16777222.0,      /* 2^24 + 6 */
        16777224.0,      /* 2^24 + 8 */

        0x1.fffffep100f,   /* large integer with full mantissa */

        /* Same as above but negative */

        -0.0,
        -FLT_TRUE_MIN,    /* smallest denormal > 0 */
        -FLT_MIN,         /* smallest normal > 0 */
        -(0.5 - (FLT_EPSILON / 4.)),
        -0.5,
        -(0.5 + (FLT_EPSILON / 2.)),
        -(1.0 - (FLT_EPSILON / 2.)),
        -1.0,
        -(1.0 + FLT_EPSILON),
        -(1.5 - FLT_EPSILON),
        -1.5,
        -(1.5 + FLT_EPSILON),
        -(2.0 - FLT_EPSILON),
        -2.0,
        -(2.0 + (2.0 * FLT_EPSILON)),
        -(2.5 - (2.0 * FLT_EPSILON)),
        -2.5,
        -(2.5 + (2.0 * FLT_EPSILON)),
        -(3.0 - (2.0 * FLT_EPSILON)),
        -3.0,
        -(3.0 + (2.0 * FLT_EPSILON)),
        -(3.5 - (2.0 * FLT_EPSILON)),
        -3.5,
        -(3.5 + (2.0 * FLT_EPSILON)),
        -(4.0 - (2.0 * FLT_EPSILON)),
        -4.0,
        -(4.0 + (4.0 * FLT_EPSILON)),

        -2097150.000,     /* 2^21 - 2 */
        -2097150.125,     /* 2^21 - 1.875 */
        -2097150.250,     /* 2^21 - 1.75 */
        -2097150.375,     /* 2^21 - 1.625 */
        -2097150.500,     /* 2^21 - 1.5 */
        -2097150.625,     /* 2^21 - 1.375 */
        -2097150.750,     /* 2^21 - 1.25 */
        -2097150.875,     /* 2^21 - 1.125 */
        -2097151.000,     /* 2^21 - 1 */
        -2097151.125,     /* 2^21 - 0.875 */
        -2097151.250,     /* 2^21 - 0.75 */
        -2097151.375,     /* 2^21 - 0.625 */
        -2097151.500,     /* 2^21 - 0.5 */
        -2097151.625,     /* 2^21 - 0.375 */
        -2097151.750,     /* 2^21 - 0.25 */
        -2097151.875,     /* 2^21 - 0.125 */
        -2097152.00,      /* 2^21 */
        -2097152.25,      /* 2^21 + 0.25 */
        -2097152.50,      /* 2^21 + 0.5 */
        -2097152.75,      /* 2^21 + 0.75 */
        -2097153.00,      /* 2^21 + 1 */
        -2097153.25,      /* 2^21 + 1.25 */
        -2097153.50,      /* 2^21 + 1.5 */
        -2097153.75,      /* 2^21 + 1.75 */
        -2097154.00,      /* 2^21 + 2 */

        -4194302.00,      /* 2^22 - 2 */
        -4194302.25,      /* 2^22 - 1.75 */
        -4194302.50,      /* 2^22 - 1.5 */
        -4194302.75,      /* 2^22 - 1.25 */
        -4194303.00,      /* 2^22 - 1 */
        -4194303.25,      /* 2^22 - 0.75 */
        -4194303.50,      /* 2^22 - 0.5 */
        -4194303.75,      /* 2^22 - 0.25 */
        -4194304.0,       /* 2^22 */
        -4194304.5,       /* 2^22 + 0.5 */
        -4194305.0,       /* 2^22 + 1 */
        -4194305.5,       /* 2^22 + 1.5 */
        -4194306.0,       /* 2^22 + 2 */

        -8388604.0,      /* 2^23 - 4 */
        -8388604.5,      /* 2^23 - 3.5 */
        -8388605.0,      /* 2^23 - 3 */
        -8388605.5,      /* 2^23 - 2.5 */
        -8388606.0,      /* 2^23 - 2 */
        -8388606.5,      /* 2^23 - 1.5 */
        -8388607.0,      /* 2^23 - 1 */
        -8388607.5,      /* 2^23 - 0.5 */
        -8388608.0,      /* 2^23 */
        -8388609.0,      /* 2^23 + 1 */
        -8388610.0,      /* 2^23 + 2 */
        -8388611.0,      /* 2^23 + 3 */
        -8388612.0,      /* 2^23 + 4 */

        -16777208.0,      /* 2^24 - 8 */
        -16777209.0,      /* 2^24 - 7 */
        -16777210.0,      /* 2^24 - 6 */
        -16777211.0,      /* 2^24 - 5 */
        -16777212.0,      /* 2^24 - 4 */
        -16777213.0,      /* 2^24 - 3 */
        -16777214.0,      /* 2^24 - 2 */
        -16777215.0,      /* 2^24 - 1 */
        -16777216.0,      /* 2^24 */
        -16777218.0,      /* 2^24 + 2 */
        -16777220.0,      /* 2^24 + 4 */
        -16777222.0,      /* 2^24 + 6 */
        -16777224.0,      /* 2^24 + 8 */

        -0x1.fffffep100f,   /* large integer with full mantissa */

        /* a few random numbers */
        3.5, -2.1, 100.0, 50.0, -1024.0, 0.0, 768.3156, 1080.5, -600.0, 1.0
};

static float float_results_trunc[FLOAT_CASES] = {
        HUGE_VALF,
        -HUGE_VALF,
        __builtin_nanf(""),
        -__builtin_nanf(""),
        __builtin_nanf("0xdeadbe"),
        -__builtin_nanf("0xdeadbe"),

        0.0,
        0.0,
        0.0,
        0.0,
        0.0,
        0.0,
        0.0,
        1.0,
        1.0,
        1.0,
        1.0,
        1.0,
        1.0,
        2.0,
        2.0,
        2.0,
        2.0,
        2.0,
        2.0,
        3.0,
        3.0,
        3.0,
        3.0,
        3.0,
        3.0,
        4.0,
        4.0,

        2097150.000,     /* 2^21 - 2 */
        2097150.000,     /* 2^21 - 1.875 */
        2097150.000,     /* 2^21 - 1.75 */
        2097150.000,     /* 2^21 - 1.625 */
        2097150.000,     /* 2^21 - 1.5 */
        2097150.000,     /* 2^21 - 1.375 */
        2097150.000,     /* 2^21 - 1.25 */
        2097150.000,     /* 2^21 - 1.125 */
        2097151.000,     /* 2^21 - 1 */
        2097151.000,     /* 2^21 - 0.875 */
        2097151.000,     /* 2^21 - 0.75 */
        2097151.000,     /* 2^21 - 0.625 */
        2097151.000,     /* 2^21 - 0.5 */
        2097151.000,     /* 2^21 - 0.375 */
        2097151.000,     /* 2^21 - 0.25 */
        2097151.000,     /* 2^21 - 0.125 */
        2097152.00,      /* 2^21 */
        2097152.00,      /* 2^21 + 0.25 */
        2097152.00,      /* 2^21 + 0.5 */
        2097152.00,      /* 2^21 + 0.75 */
        2097153.00,      /* 2^21 + 1 */
        2097153.00,      /* 2^21 + 1.25 */
        2097153.00,      /* 2^21 + 1.5 */
        2097153.00,      /* 2^21 + 1.75 */
        2097154.00,      /* 2^21 + 2 */

        4194302.00,      /* 2^22 - 2 */
        4194302.00,      /* 2^22 - 1.75 */
        4194302.00,      /* 2^22 - 1.5 */
        4194302.00,      /* 2^22 - 1.25 */
        4194303.00,      /* 2^22 - 1 */
        4194303.00,      /* 2^22 - 0.75 */
        4194303.00,      /* 2^22 - 0.5 */
        4194303.00,      /* 2^22 - 0.25 */
        4194304.0,       /* 2^22 */
        4194304.0,       /* 2^22 + 0.5 */
        4194305.0,       /* 2^22 + 1 */
        4194305.0,       /* 2^22 + 1.5 */
        4194306.0,       /* 2^22 + 2 */

        8388604.0,      /* 2^23 - 4 */
        8388604.0,      /* 2^23 - 3.5 */
        8388605.0,      /* 2^23 - 3 */
        8388605.0,      /* 2^23 - 2.5 */
        8388606.0,      /* 2^23 - 2 */
        8388606.0,      /* 2^23 - 1.5 */
        8388607.0,      /* 2^23 - 1 */
        8388607.0,      /* 2^23 - 0.5 */
        8388608.0,      /* 2^23 */
        8388609.0,      /* 2^23 + 1 */
        8388610.0,      /* 2^23 + 2 */
        8388611.0,      /* 2^23 + 3 */
        8388612.0,      /* 2^23 + 4 */

        16777208.0,      /* 2^24 - 8 */
        16777209.0,      /* 2^24 - 7 */
        16777210.0,      /* 2^24 - 6 */
        16777211.0,      /* 2^24 - 5 */
        16777212.0,      /* 2^24 - 4 */
        16777213.0,      /* 2^24 - 3 */
        16777214.0,      /* 2^24 - 2 */
        16777215.0,      /* 2^24 - 1 */
        16777216.0,      /* 2^24 */
        16777218.0,      /* 2^24 + 2 */
        16777220.0,      /* 2^24 + 4 */
        16777222.0,      /* 2^24 + 6 */
        16777224.0,      /* 2^24 + 8 */

        0x1.fffffep100f,   /* large integer with full mantissa */

        /* Same as above but negative */

        -0.0,
        -0.0,
        -0.0,
        -0.0,
        -0.0,
        -0.0,
        -0.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -2.0,
        -2.0,
        -2.0,
        -2.0,
        -2.0,
        -2.0,
        -3.0,
        -3.0,
        -3.0,
        -3.0,
        -3.0,
        -3.0,
        -4.0,
        -4.0,

        -2097150.000,     /* 2^21 - 2 */
        -2097150.000,     /* 2^21 - 1.875 */
        -2097150.000,     /* 2^21 - 1.75 */
        -2097150.000,     /* 2^21 - 1.625 */
        -2097150.000,     /* 2^21 - 1.5 */
        -2097150.000,     /* 2^21 - 1.375 */
        -2097150.000,     /* 2^21 - 1.25 */
        -2097150.000,     /* 2^21 - 1.125 */
        -2097151.000,     /* 2^21 - 1 */
        -2097151.000,     /* 2^21 - 0.875 */
        -2097151.000,     /* 2^21 - 0.75 */
        -2097151.000,     /* 2^21 - 0.625 */
        -2097151.000,     /* 2^21 - 0.5 */
        -2097151.000,     /* 2^21 - 0.375 */
        -2097151.000,     /* 2^21 - 0.25 */
        -2097151.000,     /* 2^21 - 0.125 */
        -2097152.00,      /* 2^21 */
        -2097152.00,      /* 2^21 + 0.25 */
        -2097152.00,      /* 2^21 + 0.5 */
        -2097152.00,      /* 2^21 + 0.75 */
        -2097153.00,      /* 2^21 + 1 */
        -2097153.00,      /* 2^21 + 1.25 */
        -2097153.00,      /* 2^21 + 1.5 */
        -2097153.00,      /* 2^21 + 1.75 */
        -2097154.00,      /* 2^21 + 2 */

        -4194302.00,      /* 2^22 - 2 */
        -4194302.00,      /* 2^22 - 1.75 */
        -4194302.00,      /* 2^22 - 1.5 */
        -4194302.00,      /* 2^22 - 1.25 */
        -4194303.00,      /* 2^22 - 1 */
        -4194303.00,      /* 2^22 - 0.75 */
        -4194303.00,      /* 2^22 - 0.5 */
        -4194303.00,      /* 2^22 - 0.25 */
        -4194304.0,       /* 2^22 */
        -4194304.0,       /* 2^22 + 0.5 */
        -4194305.0,       /* 2^22 + 1 */
        -4194305.0,       /* 2^22 + 1.5 */
        -4194306.0,       /* 2^22 + 2 */

        -8388604.0,      /* 2^23 - 4 */
        -8388604.0,      /* 2^23 - 3.5 */
        -8388605.0,      /* 2^23 - 3 */
        -8388605.0,      /* 2^23 - 2.5 */
        -8388606.0,      /* 2^23 - 2 */
        -8388606.0,      /* 2^23 - 1.5 */
        -8388607.0,      /* 2^23 - 1 */
        -8388607.0,      /* 2^23 - 0.5 */
        -8388608.0,      /* 2^23 */
        -8388609.0,      /* 2^23 + 1 */
        -8388610.0,      /* 2^23 + 2 */
        -8388611.0,      /* 2^23 + 3 */
        -8388612.0,      /* 2^23 + 4 */

        -16777208.0,      /* 2^24 - 8 */
        -16777209.0,      /* 2^24 - 7 */
        -16777210.0,      /* 2^24 - 6 */
        -16777211.0,      /* 2^24 - 5 */
        -16777212.0,      /* 2^24 - 4 */
        -16777213.0,      /* 2^24 - 3 */
        -16777214.0,      /* 2^24 - 2 */
        -16777215.0,      /* 2^24 - 1 */
        -16777216.0,      /* 2^24 */
        -16777218.0,      /* 2^24 + 2 */
        -16777220.0,      /* 2^24 + 4 */
        -16777222.0,      /* 2^24 + 6 */
        -16777224.0,      /* 2^24 + 8 */

        -0x1.fffffep100f,   /* large integer with full mantissa */

        /* a few random numbers */
        3.0, -2.0, 100.0, 50.0, -1024.0, 0.0, 768.0, 1080.0, -600.0, 1.0
};

static float float_results_round[FLOAT_CASES] = {
        HUGE_VALF,
        -HUGE_VALF,
        __builtin_nanf(""),
        -__builtin_nanf(""),
        __builtin_nanf("0xdeadbe"),
        -__builtin_nanf("0xdeadbe"),

        0.0,
        0.0,    /* smallest denormal > 0 */
        0.0,         /* smallest normal > 0 */
        0.0,
        1.0,
        1.0,
        1.0,
        1.0,
        1.0,
        1.0,
        2.0,
        2.0,
        2.0,
        2.0,
        2.0,
        2.0,
        3.0,
        3.0,
        3.0,
        3.0,
        3.0,
        3.0,
        4.0,
        4.0,
        4.0,
        4.0,
        4.0,

        2097150.000,     /* 2^21 - 2 */
        2097150.000,     /* 2^21 - 1.875 */
        2097150.000,     /* 2^21 - 1.75 */
        2097150.000,     /* 2^21 - 1.625 */
        2097151.000,     /* 2^21 - 1.5 */
        2097151.000,     /* 2^21 - 1.375 */
        2097151.000,     /* 2^21 - 1.25 */
        2097151.000,     /* 2^21 - 1.125 */
        2097151.000,     /* 2^21 - 1 */
        2097151.000,     /* 2^21 - 0.875 */
        2097151.000,     /* 2^21 - 0.75 */
        2097151.000,     /* 2^21 - 0.625 */
        2097152.000,     /* 2^21 - 0.5 */
        2097152.000,     /* 2^21 - 0.375 */
        2097152.000,     /* 2^21 - 0.25 */
        2097152.000,     /* 2^21 - 0.125 */
        2097152.00,      /* 2^21 */
        2097152.00,      /* 2^21 + 0.25 */
        2097153.00,      /* 2^21 + 0.5 */
        2097153.00,      /* 2^21 + 0.75 */
        2097153.00,      /* 2^21 + 1 */
        2097153.00,      /* 2^21 + 1.25 */
        2097154.00,      /* 2^21 + 1.5 */
        2097154.00,      /* 2^21 + 1.75 */
        2097154.00,      /* 2^21 + 2 */

        4194302.00,      /* 2^22 - 2 */
        4194302.00,      /* 2^22 - 1.75 */
        4194303.00,      /* 2^22 - 1.5 */
        4194303.00,      /* 2^22 - 1.25 */
        4194303.00,      /* 2^22 - 1 */
        4194303.00,      /* 2^22 - 0.75 */
        4194304.00,      /* 2^22 - 0.5 */
        4194304.00,      /* 2^22 - 0.25 */
        4194304.0,       /* 2^22 */
        4194305.0,       /* 2^22 + 0.5 */
        4194305.0,       /* 2^22 + 1 */
        4194306.0,       /* 2^22 + 1.5 */
        4194306.0,       /* 2^22 + 2 */

        8388604.0,      /* 2^23 - 4 */
        8388605.0,      /* 2^23 - 3.5 */
        8388605.0,      /* 2^23 - 3 */
        8388606.0,      /* 2^23 - 2.5 */
        8388606.0,      /* 2^23 - 2 */
        8388607.0,      /* 2^23 - 1.5 */
        8388607.0,      /* 2^23 - 1 */
        8388608.0,      /* 2^23 - 0.5 */
        8388608.0,      /* 2^23 */
        8388609.0,      /* 2^23 + 1 */
        8388610.0,      /* 2^23 + 2 */
        8388611.0,      /* 2^23 + 3 */
        8388612.0,      /* 2^23 + 4 */

        16777208.0,      /* 2^24 - 8 */
        16777209.0,      /* 2^24 - 7 */
        16777210.0,      /* 2^24 - 6 */
        16777211.0,      /* 2^24 - 5 */
        16777212.0,      /* 2^24 - 4 */
        16777213.0,      /* 2^24 - 3 */
        16777214.0,      /* 2^24 - 2 */
        16777215.0,      /* 2^24 - 1 */
        16777216.0,      /* 2^24 */
        16777218.0,      /* 2^24 + 2 */
        16777220.0,      /* 2^24 + 4 */
        16777222.0,      /* 2^24 + 6 */
        16777224.0,      /* 2^24 + 8 */

        0x1.fffffep100f,   /* large integer with full mantissa */

        /* Same as above but negative */

        -0.0,
        -0.0,    /* smallest denormal > 0 */
        -0.0,         /* smallest normal > 0 */
        -0.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -2.0,
        -2.0,
        -2.0,
        -2.0,
        -2.0,
        -2.0,
        -3.0,
        -3.0,
        -3.0,
        -3.0,
        -3.0,
        -3.0,
        -4.0,
        -4.0,
        -4.0,
        -4.0,
        -4.0,

        -2097150.000,     /* 2^21 - 2 */
        -2097150.000,     /* 2^21 - 1.875 */
        -2097150.000,     /* 2^21 - 1.75 */
        -2097150.000,     /* 2^21 - 1.625 */
        -2097151.000,     /* 2^21 - 1.5 */
        -2097151.000,     /* 2^21 - 1.375 */
        -2097151.000,     /* 2^21 - 1.25 */
        -2097151.000,     /* 2^21 - 1.125 */
        -2097151.000,     /* 2^21 - 1 */
        -2097151.000,     /* 2^21 - 0.875 */
        -2097151.000,     /* 2^21 - 0.75 */
        -2097151.000,     /* 2^21 - 0.625 */
        -2097152.000,     /* 2^21 - 0.5 */
        -2097152.000,     /* 2^21 - 0.375 */
        -2097152.000,     /* 2^21 - 0.25 */
        -2097152.000,     /* 2^21 - 0.125 */
        -2097152.00,      /* 2^21 */
        -2097152.00,      /* 2^21 + 0.25 */
        -2097153.00,      /* 2^21 + 0.5 */
        -2097153.00,      /* 2^21 + 0.75 */
        -2097153.00,      /* 2^21 + 1 */
        -2097153.00,      /* 2^21 + 1.25 */
        -2097154.00,      /* 2^21 + 1.5 */
        -2097154.00,      /* 2^21 + 1.75 */
        -2097154.00,      /* 2^21 + 2 */

        -4194302.00,      /* 2^22 - 2 */
        -4194302.00,      /* 2^22 - 1.75 */
        -4194303.00,      /* 2^22 - 1.5 */
        -4194303.00,      /* 2^22 - 1.25 */
        -4194303.00,      /* 2^22 - 1 */
        -4194303.00,      /* 2^22 - 0.75 */
        -4194304.00,      /* 2^22 - 0.5 */
        -4194304.00,      /* 2^22 - 0.25 */
        -4194304.0,       /* 2^22 */
        -4194305.0,       /* 2^22 + 0.5 */
        -4194305.0,       /* 2^22 + 1 */
        -4194306.0,       /* 2^22 + 1.5 */
        -4194306.0,       /* 2^22 + 2 */

        -8388604.0,      /* 2^23 - 4 */
        -8388605.0,      /* 2^23 - 3.5 */
        -8388605.0,      /* 2^23 - 3 */
        -8388606.0,      /* 2^23 - 2.5 */
        -8388606.0,      /* 2^23 - 2 */
        -8388607.0,      /* 2^23 - 1.5 */
        -8388607.0,      /* 2^23 - 1 */
        -8388608.0,      /* 2^23 - 0.5 */
        -8388608.0,      /* 2^23 */
        -8388609.0,      /* 2^23 + 1 */
        -8388610.0,      /* 2^23 + 2 */
        -8388611.0,      /* 2^23 + 3 */
        -8388612.0,      /* 2^23 + 4 */

        -16777208.0,      /* 2^24 - 8 */
        -16777209.0,      /* 2^24 - 7 */
        -16777210.0,      /* 2^24 - 6 */
        -16777211.0,      /* 2^24 - 5 */
        -16777212.0,      /* 2^24 - 4 */
        -16777213.0,      /* 2^24 - 3 */
        -16777214.0,      /* 2^24 - 2 */
        -16777215.0,      /* 2^24 - 1 */
        -16777216.0,      /* 2^24 */
        -16777218.0,      /* 2^24 + 2 */
        -16777220.0,      /* 2^24 + 4 */
        -16777222.0,      /* 2^24 + 6 */
        -16777224.0,      /* 2^24 + 8 */

        -0x1.fffffep100f,   /* large integer with full mantissa */

        /* a few random numbers */
        4.0, -2.0, 100.0, 50.0, -1024.0, 0.0, 768.0, 1081.0, -600.0, 1.0
};

static float float_results_nearbyint[FLOAT_CASES] = {
        HUGE_VALF,
        -HUGE_VALF,
        __builtin_nanf(""),
        -__builtin_nanf(""),
        __builtin_nanf("0xdeadbe"),
        -__builtin_nanf("0xdeadbe"),

        0.0,
        0.0,    /* smallest denormal > 0 */
        0.0,         /* smallest normal > 0 */
        0.0,
        0.0,
        1.0,
        1.0,
        1.0,
        1.0,
        1.0,
        2.0,
        2.0,
        2.0,
        2.0,
        2.0,
        2.0,
        2.0,
        3.0,
        3.0,
        3.0,
        3.0,
        3.0,
        4.0,
        4.0,
        4.0,
        4.0,
        4.0,

        2097150.000,     /* 2^21 - 2 */
        2097150.000,     /* 2^21 - 1.875 */
        2097150.000,     /* 2^21 - 1.75 */
        2097150.000,     /* 2^21 - 1.625 */
        2097150.000,     /* 2^21 - 1.5 */
        2097151.000,     /* 2^21 - 1.375 */
        2097151.000,     /* 2^21 - 1.25 */
        2097151.000,     /* 2^21 - 1.125 */
        2097151.000,     /* 2^21 - 1 */
        2097151.000,     /* 2^21 - 0.875 */
        2097151.000,     /* 2^21 - 0.75 */
        2097151.000,     /* 2^21 - 0.625 */
        2097152.000,     /* 2^21 - 0.5 */
        2097152.000,     /* 2^21 - 0.375 */
        2097152.000,     /* 2^21 - 0.25 */
        2097152.000,     /* 2^21 - 0.125 */
        2097152.00,      /* 2^21 */
        2097152.00,      /* 2^21 + 0.25 */
        2097152.00,      /* 2^21 + 0.5 */
        2097153.00,      /* 2^21 + 0.75 */
        2097153.00,      /* 2^21 + 1 */
        2097153.00,      /* 2^21 + 1.25 */
        2097154.00,      /* 2^21 + 1.5 */
        2097154.00,      /* 2^21 + 1.75 */
        2097154.00,      /* 2^21 + 2 */

        4194302.00,      /* 2^22 - 2 */
        4194302.00,      /* 2^22 - 1.75 */
        4194302.00,      /* 2^22 - 1.5 */
        4194303.00,      /* 2^22 - 1.25 */
        4194303.00,      /* 2^22 - 1 */
        4194303.00,      /* 2^22 - 0.75 */
        4194304.00,      /* 2^22 - 0.5 */
        4194304.0,      /* 2^22 - 0.25 */
        4194304.0,       /* 2^22 */
        4194304.0,       /* 2^22 + 0.5 */
        4194305.0,       /* 2^22 + 1 */
        4194306.0,       /* 2^22 + 1.5 */
        4194306.0,       /* 2^22 + 2 */

        8388604.0,      /* 2^23 - 4 */
        8388604.0,      /* 2^23 - 3.5 */
        8388605.0,      /* 2^23 - 3 */
        8388606.0,      /* 2^23 - 2.5 */
        8388606.0,      /* 2^23 - 2 */
        8388606.0,      /* 2^23 - 1.5 */
        8388607.0,      /* 2^23 - 1 */
        8388608.0,      /* 2^23 - 0.5 */
        8388608.0,      /* 2^23 */
        8388609.0,      /* 2^23 + 1 */
        8388610.0,      /* 2^23 + 2 */
        8388611.0,      /* 2^23 + 3 */
        8388612.0,      /* 2^23 + 4 */

        16777208.0,      /* 2^24 - 8 */
        16777209.0,      /* 2^24 - 7 */
        16777210.0,      /* 2^24 - 6 */
        16777211.0,      /* 2^24 - 5 */
        16777212.0,      /* 2^24 - 4 */
        16777213.0,      /* 2^24 - 3 */
        16777214.0,      /* 2^24 - 2 */
        16777215.0,      /* 2^24 - 1 */
        16777216.0,      /* 2^24 */
        16777218.0,      /* 2^24 + 2 */
        16777220.0,      /* 2^24 + 4 */
        16777222.0,      /* 2^24 + 6 */
        16777224.0,      /* 2^24 + 8 */

        0x1.fffffep100f,   /* large integer with full mantissa */

        /* Same as above but negative */

        -0.0,
        -0.0,    /* smallest denormal > 0 */
        -0.0,         /* smallest normal > 0 */
        -0.0,
        -0.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -2.0,
        -2.0,
        -2.0,
        -2.0,
        -2.0,
        -2.0,
        -2.0,
        -3.0,
        -3.0,
        -3.0,
        -3.0,
        -3.0,
        -4.0,
        -4.0,
        -4.0,
        -4.0,
        -4.0,

        -2097150.000,     /* 2^21 - 2 */
        -2097150.000,     /* 2^21 - 1.875 */
        -2097150.000,     /* 2^21 - 1.75 */
        -2097150.000,     /* 2^21 - 1.625 */
        -2097150.000,     /* 2^21 - 1.5 */
        -2097151.000,     /* 2^21 - 1.375 */
        -2097151.000,     /* 2^21 - 1.25 */
        -2097151.000,     /* 2^21 - 1.125 */
        -2097151.000,     /* 2^21 - 1 */
        -2097151.000,     /* 2^21 - 0.875 */
        -2097151.000,     /* 2^21 - 0.75 */
        -2097151.000,     /* 2^21 - 0.625 */
        -2097152.000,     /* 2^21 - 0.5 */
        -2097152.000,     /* 2^21 - 0.375 */
        -2097152.000,     /* 2^21 - 0.25 */
        -2097152.000,     /* 2^21 - 0.125 */
        -2097152.00,      /* 2^21 */
        -2097152.00,      /* 2^21 + 0.25 */
        -2097152.00,      /* 2^21 + 0.5 */
        -2097153.00,      /* 2^21 + 0.75 */
        -2097153.00,      /* 2^21 + 1 */
        -2097153.00,      /* 2^21 + 1.25 */
        -2097154.00,      /* 2^21 + 1.5 */
        -2097154.00,      /* 2^21 + 1.75 */
        -2097154.00,      /* 2^21 + 2 */

        -4194302.00,      /* 2^22 - 2 */
        -4194302.00,      /* 2^22 - 1.75 */
        -4194302.00,      /* 2^22 - 1.5 */
        -4194303.00,      /* 2^22 - 1.25 */
        -4194303.00,      /* 2^22 - 1 */
        -4194303.00,      /* 2^22 - 0.75 */
        -4194304.00,      /* 2^22 - 0.5 */
        -4194304.0,      /* 2^22 - 0.25 */
        -4194304.0,       /* 2^22 */
        -4194304.0,       /* 2^22 + 0.5 */
        -4194305.0,       /* 2^22 + 1 */
        -4194306.0,       /* 2^22 + 1.5 */
        -4194306.0,       /* 2^22 + 2 */

        -8388604.0,      /* 2^23 - 4 */
        -8388604.0,      /* 2^23 - 3.5 */
        -8388605.0,      /* 2^23 - 3 */
        -8388606.0,      /* 2^23 - 2.5 */
        -8388606.0,      /* 2^23 - 2 */
        -8388606.0,      /* 2^23 - 1.5 */
        -8388607.0,      /* 2^23 - 1 */
        -8388608.0,      /* 2^23 - 0.5 */
        -8388608.0,      /* 2^23 */
        -8388609.0,      /* 2^23 + 1 */
        -8388610.0,      /* 2^23 + 2 */
        -8388611.0,      /* 2^23 + 3 */
        -8388612.0,      /* 2^23 + 4 */

        -16777208.0,      /* 2^24 - 8 */
        -16777209.0,      /* 2^24 - 7 */
        -16777210.0,      /* 2^24 - 6 */
        -16777211.0,      /* 2^24 - 5 */
        -16777212.0,      /* 2^24 - 4 */
        -16777213.0,      /* 2^24 - 3 */
        -16777214.0,      /* 2^24 - 2 */
        -16777215.0,      /* 2^24 - 1 */
        -16777216.0,      /* 2^24 */
        -16777218.0,      /* 2^24 + 2 */
        -16777220.0,      /* 2^24 + 4 */
        -16777222.0,      /* 2^24 + 6 */
        -16777224.0,      /* 2^24 + 8 */

        -0x1.fffffep100f,   /* large integer with full mantissa */

        /* a few random numbers */
        4.0, -2.0, 100.0, 50.0, -1024.0, 0.0, 768.0, 1080.0, -600.0, 1.0
};

PCUT_TEST(identity)
{
        for (int i = 0; i < FLOAT_CASES; i++) {
                uint32_t f1 = fint(float_arguments[i]);
                uint32_t f2 = fint(float_identity[i]);
                if (f1 != f2) {
                        PCUT_ASSERTION_FAILED("case %d: 0x%08x != 0x%08x\n", i, f1, f2);
                }
        }
}

PCUT_TEST(truncf)
{
        for (int i = 0; i < FLOAT_CASES; i++) {
                uint32_t f1 = fint(truncf(float_arguments[i]));
                uint32_t f2 = fint(float_results_trunc[i]);
                if (f1 != f2) {
                        PCUT_ASSERTION_FAILED("case %d: 0x%08x != 0x%08x\n", i, f1, f2);
                }
        }
}

PCUT_TEST(trunc)
{
        for (int i = 0; i < FLOAT_CASES; i++) {
                uint64_t f1 = dint(trunc(float_arguments[i]));
                uint64_t f2 = dint(float_results_trunc[i]);
                if (f1 != f2) {
                        PCUT_ASSERTION_FAILED("case %d: 0x%016" PRIx64 " != 0x%016" PRIx64 "\n", i, f1, f2);
                }
        }

        // TODO: double test cases
}

PCUT_TEST(roundf)
{
        for (int i = 0; i < FLOAT_CASES; i++) {
                uint32_t f1 = fint(roundf(float_arguments[i]));
                uint32_t f2 = fint(float_results_round[i]);
                if (f1 != f2) {
                        PCUT_ASSERTION_FAILED("case %d: 0x%08x != 0x%08x\n", i, f1, f2);
                }
        }
}

PCUT_TEST(round)
{
        for (int i = 0; i < FLOAT_CASES; i++) {
                uint64_t f1 = dint(round(float_arguments[i]));
                uint64_t f2 = dint(float_results_round[i]);
                if (f1 != f2) {
                        PCUT_ASSERTION_FAILED("case %d: 0x%016" PRIx64 " != 0x%016" PRIx64 "\n", i, f1, f2);
                }
        }

        // TODO: double test cases
}

PCUT_TEST(nearbyintf)
{
        // FIXME: ensure default rounding mode

        for (int i = 0; i < FLOAT_CASES; i++) {
                uint32_t f1 = fint(nearbyintf(float_arguments[i]));
                uint32_t f2 = fint(float_results_nearbyint[i]);
                if (f1 != f2) {
                        PCUT_ASSERTION_FAILED("case %d: 0x%08x != 0x%08x\n", i, f1, f2);
                }
        }
}

PCUT_TEST(nearbyint)
{
        // FIXME: ensure default rounding mode

        for (int i = 0; i < FLOAT_CASES; i++) {
                uint64_t f1 = dint(nearbyint(float_arguments[i]));
                uint64_t f2 = dint(float_results_nearbyint[i]);
                if (f1 != f2) {
                        PCUT_ASSERTION_FAILED("case %d: 0x%016" PRIx64 " != 0x%016" PRIx64 "\n", i, f1, f2);
                }
        }

        // TODO: double test cases
}

PCUT_EXPORT(rounding);

/* [<][>][^][v][top][bottom][index][help] */
HelenOS homepage, sources at GitHub