/* * 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 #include #include #include 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);