| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515 |
- #include <stdio.h>
- #include "pico/stdlib.h"
- #include "pico/double.h"
- #include "math.h"
- #if 0
- #define printf(...) ((void)0)
- #endif
- #if 0
- #define stop() return -1
- #else
- #define stop() rc=1
- #endif
- #define test_assert(x) ({ if (!(x)) { printf("Assertion failed: ");puts(#x);printf(" at " __FILE__ ":%d\n", __LINE__); stop(); } })
- #define test_checkd(x, expected, msg) ({ if ((x) != (expected)) { printf(" %s: %f != %f\n", msg, x, expected); stop(); } })
- #define test_checki(x, expected, msg) ({ if ((x) != (expected)) { printf(" %s: %d != %d\n", msg, x, expected); stop(); } })
- #define test_checku(x, expected, msg) ({ if ((uint32_t)(x) != (uint32_t)(expected)) { printf(" %s: %u != %u\n", msg, x, expected); stop(); } })
- #define test_checki64(x, expected, msg) ({ if ((x) != (expected)) { printf(" %s: %lld != %lld\n", msg, (int64_t)(x), (int64_t)(expected)); stop(); } })
- #define test_checku64(x, expected, msg) ({ if ((uint64_t)(x) != (uint64_t)(expected)) { printf(" %s: %llu != %llu\n", msg, (uint64_t)(x), (uint64_t)(expected)); stop(); } })
- #if !(LIB_PICO_DOUBLE_COMPILER || defined(__riscv))
- static inline double fix2double_8(int32_t m) { return fix2double(m, 8); }
- static inline double fix2double_12(int32_t m) { return fix2double(m, 12); }
- static inline double fix2double_16(int32_t m) { return fix2double(m, 16); }
- static inline double fix2double_24(int32_t m) { return fix2double(m, 24); }
- static inline double fix2double_28(int32_t m) { return fix2double(m, 28); }
- static inline double fix2double_32(int32_t m) { return fix2double(m, 32); }
- static inline double ufix2double_12(int32_t m) { return ufix2double(m, 12); }
- static inline double double2fix_12(int32_t m) { return double2fix(m, 12); }
- static inline double double2ufix_12(int32_t m) { return double2ufix(m, 12); }
- #endif
- #if 1 && (LIB_PICO_DOUBLE_COMPILER || defined(__riscv))
- #define double2int_z(f) ({ double _d = f; pico_default_asm_volatile("" : "+r" (_d)); double2 ## int_z(_d); })
- #define double2uint_z(f) ({ double _d = f; pico_default_asm_volatile("" : "+r" (_d)); double2 ## uint_z(_d); })
- #define double2int64_z(f) ({ double _d = f; pico_default_asm_volatile("" : "+r" (_d)); double2 ## int64_z(_d); })
- #define double2uint64_z(f) ({ double _d = f; pico_default_asm_volatile("" : "+r" (_d)); double2 ## uint64_z(_d); })
- #define int2double(i) ({ int32_t _i = i; pico_default_asm_volatile("" : "+r" (_i)); int2 ## double(_i); })
- #define uint2double(i) ({ uint32_t _i = i; pico_default_asm_volatile("" : "+r" (_i)); uint2 ## double(_i); })
- #define int642double(i) ({ int64_t _i = i; pico_default_asm_volatile("" : "+r" (_i)); int642 ## double(_i); })
- #define uint642double(i) ({ uint64_t _i = i; pico_default_asm_volatile("" : "+r" (_i)); uint642 ## double(_i); })
- #endif
- int test() {
- int rc = 0;
- #if LIB_PICO_DOUBLE_PICO
- printf(">>> Using PICO\n");
- #endif
- printf("int2double\n");
- test_checkd(int2double(0), 0.0, "int2double1");
- test_checkd(int2double(-1), -1.0, "int2double2");
- test_checkd(int2double(1), 1.0, "int2double3");
- test_checkd(int2double(INT32_MAX), 2147483647.0, "int2double4");
- test_checkd(int2double(INT32_MIN), -2147483648.0, "int2double5");
- // these have rounding behavior on float but not double
- test_checkd(int2double(2147483391), 2147483391.0, "int2double6");
- test_checkd(int2double(2147483391), 2147483391.0, "int2double7");
- test_checkd(int2double(2147483457), 2147483457.0, "int2double8");
- test_checkd(int2double(2147483483), 2147483483.0, "int2double9");
- test_checkd(int2double(2147483584), 2147483584.0, "int2double10");
- printf("uint2double\n");
- test_checkd(uint2double(0), 0.0, "uint2double1");
- test_checkd(uint2double(1), 1.0, "uint2double2");
- test_checkd(uint2double(INT32_MAX), 2147483647.0, "uint2double3");
- // todo test correct rounding around maximum precision
- test_checkd(uint2double(UINT32_MAX), 4294967295.0, "uint2double4");
- printf("int642double\n");
- test_checkd(int642double(0), 0.0, "int642double1");
- test_checkd(int642double(-1), -1.0, "int642double2");
- test_checkd(int642double(1), 1.0, "int642double3");
- test_checkd(int642double(INT32_MAX-1), 2147483646.0, "int642double4");
- test_checkd(int642double(INT32_MAX), 2147483647.0, "int642double5");
- test_checkd(int642double(INT32_MAX+1ll), 2147483648.0, "int642double6");
- test_checkd(int642double(INT32_MIN-1ll), -2147483649.0, "int642double7");
- test_checkd(int642double(INT32_MIN), -2147483648.0, "int642double8");
- test_checkd(int642double(INT32_MIN+1ll), -2147483647.0, "int642double9");
- // todo test correct rounding around maximum precision
- test_checkd(int642double(INT64_MAX), 9223372036854775807.0, "int642double10");
- test_checkd(int642double(INT64_MIN), -9223372036854775808.0, "int642doubl11e");
- printf("uint642double\n");
- test_checkd(uint642double(0), 0.0, "uint642double1");
- test_checkd(uint642double(1), 1.0, "uint642double2");
- test_checkd(uint642double(INT32_MAX-1), 2147483646.0, "uint642double3");
- test_checkd(uint642double(INT32_MAX), 2147483647.0, "uint642double4");
- test_checkd(uint642double(INT32_MAX+1ll), 2147483648.0, "uint642double5");
- test_checkd(uint642double(INT64_MAX), 9223372036854775807.0, "uint642double6");
- // todo test correct rounding around maximum precision
- test_checkd(uint642double(UINT64_MAX), 18446744073709551615.0, "uint642double7");
- union {
- uint64_t u;
- double d;
- } u64d;
- #if !(LIB_PICO_DOUBLE_COMPILER || defined(__riscv))
- printf("fix2double\n");
- // todo test correct rounding around maximum precision
- test_checkd(fix2double(-3, 1), -1.5, "fix2double1");
- test_checkd(fix2double(-3, 1), -1.5, "fix2double2");
- test_checkd(fix2double(-3, -4), -48.0, "fix2double3");
- printf("ufix2double\n");
- // todo test correct rounding around maximum precision
- test_checkd(ufix2double(0xa0000000, 30), 2.5, "ufix2double1");
- test_checkd(ufix2double(3, -4), 48.0, "ufix2double2");
- printf("fix64double\n");
- // todo test correct rounding around maximum precision
- test_checkd(fix642double(-0xa000000000ll, 38), -2.5, "fix642double1");
- test_checkd(fix642double(-3, -34), -51539607552.0, "fix642double2");
- printf("ufix642double\n");
- // todo test correct rounding around maximum precision
- test_checkd(ufix642double(0xa000000000ll, 38), 2.5, "ufix642double1");
- test_checkd(ufix642double(3, -34), 51539607552.0, "fix64double2");
- test_checkd(fix2double_8(128), 0.5, "fix2double_8_1");
- test_checkd(fix2double_8(-128), -0.5, "fix2double_8_2");
- test_checkd(fix2double_16(8192), 0.125, "fix2double_8_3");
- test_checkd(fix2double_16(-8192), -0.125, "fix2double_8_4");
- test_checkd(fix2double_24(3<<23), 1.5, "fix2double_8_5");
- test_checkd(fix2double_24(-(3<<23)), -1.5, "fix2double_8_6");
- printf("double2fix\n");
- test_checki(double2fix(-0.5, 8), -0x80, "double2fix0");
- test_checki(double2fix(3.5, 8), 0x380, "double2fix1");
- test_checki(double2fix(-3.5, 8), -0x380, "double2fix2");
- test_checki(double2fix(32768.0, 16), INT32_MAX, "double2fix3");
- test_checki(double2fix(65536.0, 16), INT32_MAX, "double2fix4");
- test_checki(double2fix(-65536.0, 16), INT32_MIN, "double2fix4b");
- test_checki(double2fix(INFINITY, 16), INT32_MAX, "double2fix5");
- test_checki(double2fix(-INFINITY, 16), INT32_MIN, "double2fix5b");
- test_checki(double2fix(INFINITY, -16), INT32_MAX, "double2fix5c");
- test_checki(double2fix(-INFINITY, -16), INT32_MIN, "double2fix5d");
- test_checki(double2fix(3.24999, 2), 12, "double2fix6");
- test_checki(double2fix(3.25, 2), 13, "double2fix7");
- test_checki(double2fix(-3.24999, 2), -13, "double2fix8");
- test_checki(double2fix(-3.25, 2), -13, "double2fix9");
- test_checki(double2fix(-0.75, 1), -2, "double2fix10");
- test_checki(double2fix(-3.0, -1), -2, "double2fix11"); // not very useful
- test_checki(double2fix(0.0, 16), 0, "double2fix12");
- test_checki(double2fix(-0.0, 16), 0, "double2fix13");
- test_checki(double2fix(0.0, -16), 0, "double2fix14");
- test_checki(double2fix(-0.0, -16), 0, "double2fix15");
- printf("double2ufix\n");
- test_checku(double2ufix(3.5, 8), 0x380, "double2ufix1");
- test_checku(double2ufix(-3.5, 8), 0, "double2ufix2");
- test_checku(double2ufix(32768.0, 16), 32768 << 16, "double2ufix3");
- test_checku(double2ufix(65536.0, 16), UINT32_MAX, "double2ufix4");
- test_checku(double2ufix(INFINITY, 16), UINT32_MAX, "double2ufix5");
- test_checku(double2ufix(-INFINITY, 16), 0, "double2ufix5b");
- test_checku(double2ufix(INFINITY, -16), UINT32_MAX, "double2ufix5c");
- test_checku(double2ufix(-INFINITY, -16), 0, "double2ufix5d");
- test_checku(double2ufix(3.24999, 2), 12, "double2ufix6");
- test_checku(double2ufix(3.25, 2), 13, "double2ufix7");
- test_checku(double2ufix(3.0, -1), 1, "double2ufix8"); // not very useful
- test_checki(double2ufix(0.0, 16), 0, "double2ufix12");
- test_checki(double2ufix(-0.0, 16), 0, "double2fix13");
- test_checki(double2ufix(0.0, -16), 0, "double2ufix14");
- test_checki(double2ufix(-0.0, -16), 0, "double2fix15");
- printf("double2fix64\n");
- test_checki64(double2fix64(3.5, 8), 0x380, "double2fix641");
- test_checki64(double2fix64(-3.5, 8), -0x380, "double2fix642");
- test_checki64(double2fix64(32768.0, 16), 32768ll << 16, "double2fix643");
- test_checki64(double2fix64(65536.0, 16), 65536ll << 16, "double2fix644");
- test_checki64(double2fix64(2147483648.0, 16), 2147483648ll << 16, "double2ufix644b");
- test_checki64(double2fix64(65536.0 * 65536.0 * 32768.0, 16), INT64_MAX, "double2fix644c");
- test_checki64(double2fix64(INFINITY, 16), INT64_MAX, "double2fix645");
- test_checki64(double2fix64(-INFINITY, 16), INT64_MIN, "double2fix645b");
- test_checki64(double2fix64(INFINITY, -16), INT64_MAX, "double2fix645c");
- test_checki64(double2fix64(-INFINITY, -16), INT64_MIN, "double2fix645d");
- test_checki64(double2fix64(3.24999, 2), 12, "double2fix646");
- test_checki64(double2fix64(3.25, 2), 13, "double2fix647");
- test_checki64(double2fix64(-3.24999, 2), -13, "double2fix648");
- test_checki64(double2fix64(-3.25, 2), -13, "double2fix649");
- test_checki64(double2fix64(-3.0, -1), -2, "double2fix6410"); // not very useful
- test_checki64(double2fix64(2147483648.0 * 2147483648.0, 16), INT64_MAX, "double2ufix6411");
- test_checki64(double2fix64(0.0, 16), 0, "double2fix6412");
- test_checki64(double2fix64(-0.0, 16), 0, "double2fix6413");
- test_checki64(double2fix64(0.0, -16), 0, "double2fix6412b");
- test_checki64(double2fix64(-0.0, -16), 0, "double2fix6413b");
- test_checki64(double2fix64(-3.25, 40), -13ll * (1ll << 38), "double2fix6414");
- u64d.u = 0xc00a000000000001;
- test_checki64(double2fix64(u64d.d, 40), -13ll * (1ll << 38) - 1ll, "double2fix6414b");
- u64d.u = 0xc00a000080000001;
- test_checki64(double2fix64(u64d.d, 20), -13ll * (1ll << 18) - 2ll, "double2fix6415c");
- u64d.u = 0xc00a000080000000;
- test_checki64(double2fix64(u64d.d, 20), -13ll * (1ll << 18) - 1ll, "double2fix6415d");
- u64d.u = 0xc00a000000000001;
- test_checki64(double2fix64(u64d.d, 20), -13ll * (1ll << 18) - 1ll, "double2fix6415e");
- u64d.u = 0xc00a000000000000;
- test_checki64(double2fix64(u64d.d, 20), -13ll * (1ll << 18), "double2fix6415g");
- u64d.u = 0xc00a000080000001;
- test_checki64(double2fix64(u64d.d, 19), -13ll * (1ll << 17) - 1ll, "double2fix6415h");
- u64d.u = 0xc00a000080000000;
- test_checki64(double2fix64(u64d.d, 19), -13ll * (1ll << 17) - 1ll, "double2fix6415i");
- u64d.u = 0xc00a000000000001;
- test_checki64(double2fix64(u64d.d, 19), -13ll * (1ll << 17) - 1ll, "double2fix6415j");
- u64d.u = 0xc00a000000000000;
- test_checki64(double2fix64(u64d.d, 19), -13ll * (1ll << 17), "double2fix6415k");
- printf("double2ufix64\n");
- test_checku64(double2ufix64(3.5, 8), 0x380, "double2ufix641");
- test_checku64(double2ufix64(-3.5, 8), 0, "double2ufix642");
- test_checku64(double2ufix64(32768.0, 16), 32768ull << 16, "double2ufix643");
- test_checku64(double2ufix64(65536.0, 16), 65536ull << 16, "double2ufix644");
- test_checku64(double2ufix64(2147483648.0, 16), 2147483648ull << 16, "double2ufix644b");
- test_checku64(double2ufix64(INFINITY, 16), UINT64_MAX, "double2ufix645");
- test_checku64(double2ufix64(-INFINITY, 16), 0, "double2ufix645b");
- test_checku64(double2ufix64(INFINITY, -16), UINT64_MAX, "double2ufix645c");
- test_checku64(double2ufix64(-INFINITY, -16), 0, "double2ufix645d");
- test_checku64(double2ufix64(3.24999, 2), 12, "double2ufix646");
- test_checku64(double2ufix64(3.25, 2), 13, "double2ufix647");
- test_checku64(double2ufix64(3.0, -1), 1, "double2ufix648"); // not very useful
- test_checki64(double2ufix64(0.0, 16), 0, "double2ufix649");
- test_checki64(double2ufix64(-0.0, 16), 0, "double2ufix6410");
- printf("double2fix_z\n");
- test_checki(double2fix_z(3.5, 8), 0x380, "double2fix_z1");
- test_checki(double2fix_z(-3.5, 8), -0x380, "double2fix_z2");
- test_checki(double2fix_z(32768.0, 16), INT32_MAX, "double2fix_z3");
- test_checki(double2fix_z(65536.0, 16), INT32_MAX, "double2fix_z4");
- test_checki(double2fix_z(INFINITY, 16), INT32_MAX, "double2fix_z5");
- test_checki(double2fix_z(-INFINITY, 16), INT32_MIN, "double2fix_z5b");
- test_checki(double2fix_z(INFINITY, -50), INT32_MAX, "double2fix_z5c");
- test_checki(double2fix_z(-INFINITY, -50), INT32_MIN, "double2fix_z5d");
- test_checki(double2fix_z(3.24999, 2), 12, "double2fix_z6");
- test_checki(double2fix_z(3.25, 2), 13, "double2fix_z7");
- test_checki(double2fix_z(-3.24999, 2), -12, "double2fix_z8");
- test_checki(double2fix_z(-3.25, 2), -13, "double2fix_z9");
- test_checki(double2fix_z(-0.75, 1), -1, "double2fix_z10");
- test_checki(double2fix_z(-3.0, -1), -1, "double2fix_z11"); // not very useful
- test_checki(double2fix_z(0.0, 16), 0, "double2fix_z12");
- test_checki(double2fix_z(-0.0, 16), 0, "double2fix_z13");
- test_checki(double2fix_z(0.0, -16), 0, "double2fix_z12b");
- test_checki(double2fix_z(-0.0, -16), 0, "double2fix_z13b");
- printf("double2ufix_z\n");
- test_checku(double2ufix_z(3.5, 8), 0x380, "double2ufix_z1");
- test_checku(double2ufix_z(-3.5, 8), 0, "double2ufix_z2");
- test_checku(double2ufix_z(32768.0, 16), 32768 << 16, "double2ufix_z3");
- test_checku(double2ufix_z(65536.0, 16), UINT32_MAX, "double2ufix_z4");
- test_checku(double2ufix_z(INFINITY, 16), UINT32_MAX, "double2ufix_z5");
- test_checku(double2ufix_z(-INFINITY, 16), 0, "double2ufix_z5b");
- test_checku(double2ufix_z(INFINITY, 16), UINT32_MAX, "double2ufix_z5c");
- test_checku(double2ufix_z(-INFINITY, 16), 0, "double2ufix_z5d");
- test_checku(double2ufix_z(3.24999, 2), 12, "double2ufix_z6");
- test_checku(double2ufix_z(3.25, 2), 13, "double2ufix_z7");
- test_checku(double2ufix_z(3.0, -1), 1, "double2ufix_z8"); // not very useful
- test_checki(double2ufix_z(0.0, 16), 0, "double2fix_z9");
- test_checki(double2ufix_z(-0.0, 16), 0, "double2fix_z10");
- test_checki(double2ufix_z(0.0, -16), 0, "double2fix_z11");
- test_checki(double2ufix_z(-0.0, -16), 0, "double2fix_z12");
- printf("double2fix64_z\n");
- test_checki64(double2fix64_z(3.5, 8), 0x380, "double2fix64_z1");
- test_checki64(double2fix64_z(-3.5, 8), -0x380, "double2fix64_z2");
- test_checki64(double2fix64_z(32768.0, 16), 32768ll << 16, "double2fix64_z3");
- test_checki64(double2fix64_z(65536.0, 16), 65536ll << 16, "double2fix64_z4");
- test_checki64(double2fix64_z(65536.0 * 65536.0 * 32768.0, 16), INT64_MAX, "double2fix64_z4b");
- test_checki64(double2fix64_z(INFINITY, 16), INT64_MAX, "double2fix64_z5");
- test_checki64(double2fix64_z(-INFINITY, 16), INT64_MIN, "double2fix64_z5");
- test_checki64(double2fix64_z(INFINITY, 16), INT64_MAX, "double2fix64_z5");
- test_checki64(double2fix64_z(-INFINITY, 16), INT64_MIN, "double2fix64_z5");
- test_checki64(double2fix64_z(3.24999, 2), 12, "double2fix64_z6");
- test_checki64(double2fix64_z(3.25, 2), 13, "double2fix64_z7");
- test_checki64(double2fix64_z(-3.24999, 2), -12, "double2fix64_z8");
- test_checki64(double2fix64_z(-3.25, 2), -13, "double2fix64_z9");
- test_checki64(double2fix64_z(-3.0, -1), -1, "double2fix64_z10"); // not very useful
- test_checki64(double2fix64_z(0.0, 16), 0, "double2fix64_z11");
- test_checki64(double2fix64_z(-0.0, 16), 0, "double2fix64_z12");
- test_checki64(double2fix64_z(0.0, -16), 0, "double2fix64_z13");
- test_checki64(double2fix64_z(-0.0, -16), 0, "double2fix64_z14");
- test_checki64(double2fix64_z(-3.25, 40), -13ll * (1ll << 38), "double2fix64_z15");
- u64d.u = 0xc00a000000000001;
- test_checki64(double2fix64_z(u64d.d, 40), -13ll * (1ll << 38), "double2fix64_z15b");
- u64d.u = 0xc00a000080000001;
- test_checki64(double2fix64_z(u64d.d, 20), -13ll * (1ll << 18) - 1ll, "double2fix64_z15c");
- u64d.u = 0xc00a000080000000;
- test_checki64(double2fix64_z(u64d.d, 20), -13ll * (1ll << 18) - 1ll, "double2fix64_z15d");
- u64d.u = 0xc00a000000000001;
- test_checki64(double2fix64_z(u64d.d, 20), -13ll * (1ll << 18), "double2fix64_z15e");
- u64d.u = 0xc00a000000000000;
- test_checki64(double2fix64_z(u64d.d, 20), -13ll * (1ll << 18), "double2fix64_z15g");
- u64d.u = 0xc00a000080000001;
- test_checki64(double2fix64_z(u64d.d, 19), -13ll * (1ll << 17), "double2fix64_z15h");
- u64d.u = 0xc00a000080000000;
- test_checki64(double2fix64_z(u64d.d, 19), -13ll * (1ll << 17), "double2fix64_z15i");
- u64d.u = 0xc00a000000000001;
- test_checki64(double2fix64_z(u64d.d, 19), -13ll * (1ll << 17), "double2fix64_z15j");
- u64d.u = 0xc00a000000000000;
- test_checki64(double2fix64_z(u64d.d, 19), -13ll * (1ll << 17), "double2fix64_z15k");
- printf("double2ufix64_z\n");
- test_checku64(double2ufix64_z(3.5, 8), 0x380, "double2ufix64_z1");
- test_checku64(double2ufix64_z(-3.5, 8), 0, "double2ufix64_z2");
- test_checku64(double2ufix64_z(32768.0, 16), 32768ll << 16, "double2ufix64_z3");
- test_checku64(double2ufix64_z(65536.0, 16), 65536ll << 16, "double2ufix64_z4");
- test_checki64(double2ufix64_z(65536.0 * 65536.0 * 65536.0, 16), UINT64_MAX, "double2fix64_z4b");
- test_checku64(double2ufix64_z(INFINITY, 16), UINT64_MAX, "double2ufix64_z5");
- test_checku64(double2ufix64_z(-INFINITY, 16), 0, "double2ufix64_z5b");
- test_checku64(double2ufix64_z(INFINITY, 16), UINT64_MAX, "double2ufix64_z5c");
- test_checku64(double2ufix64_z(-INFINITY, 16), 0, "double2ufix64_z5d");
- test_checku64(double2ufix64_z(3.24999, 2), 12, "double2ufix64_z6");
- test_checku64(double2ufix64_z(3.25, 2), 13, "double2ufix64_z7");
- test_checki64(double2ufix64_z(3.0, -1), 1, "double2fuix64_z8"); // not very useful
- test_checki64(double2ufix64_z(0.0, 16), 0, "double2ufix64_z9");
- test_checki64(double2ufix64_z(-0.0, 16), 0, "double2ufix64_z10");
- test_checki64(double2ufix64_z(0.0, -16), 0, "double2ufix64_z11");
- test_checki64(double2ufix64_z(-0.0, -16), 0, "double2ufix64_z12");
- printf("double2int\n");
- test_checki(double2int(0.0), 0, "double2int1");
- test_checki(double2int(0.25), 0, "double2int1b");
- test_checki(double2int(0.5), 0, "double2int2");
- test_checki(double2int(0.75), 0, "double2int2b");
- test_checki(double2int(1.0), 1, "double2int3");
- test_checki(double2int(-10.0), -10, "double2int3a");
- test_checki(double2int(-0.0), 0, "double2int3b");
- test_checki(double2int(-0.25), -1, "double2int4");
- test_checki(double2int(-0.5), -1, "double2int4b");
- test_checki(double2int(-0.75), -1, "double2int5");
- test_checki(double2int(-1.0), -1, "double2int5b");
- // todo test correct rounding around maximum precision
- test_checki(double2int(2147483646.0), INT32_MAX-1, "double2int6");
- test_checki(double2int(2147483647.0), INT32_MAX, "double2int6b");
- test_checki(double2int(21474836470.0), INT32_MAX, "double2int7");
- test_checki(double2int(-2147483648.0), INT32_MIN, "double2int8");
- test_checki(double2int(-21474836480.0), INT32_MIN, "double2int9");
- test_checki(double2int(-2.5), -3, "double2int10");
- test_checki(double2int(-2.4), -3, "double2int11");
- u64d.u = 0xc000000000000000ull;
- test_checki(double2int(u64d.d), -2, "double2int12");
- u64d.u = 0xc008000000000000ull;
- test_checki(double2int(u64d.d), -3, "double2int12b");
- u64d.u = 0xc000000000000001ull;
- test_checki(double2int(u64d.d), -3, "double2int12c");
- u64d.u = 0xc000000080000000ull;
- test_checki(double2int(u64d.d), -3, "double2int12d");
- u64d.u = 0xc000000100000000ull;
- test_checki(double2int(u64d.d), -3, "double2int12e");
- u64d.u = 0xc000000100000001ull;
- test_checki(double2int(u64d.d), -3, "double2int12f");
- test_checki(double2int(-2147483647.0), INT32_MIN+1, "double2int13");
- test_checki(double2int(-2147483647.1), INT32_MIN, "double2int14");
- test_checki(double2int(-2147483647.9), INT32_MIN, "double2int15");
- test_checki(double2int(-2147483648.0), INT32_MIN, "double2int16");
- test_checki(double2int(-2147483648.1), INT32_MIN, "double2int17");
- test_checki(double2int(-21474836480.1), INT32_MIN, "double2int18");
- printf("double2uint\n");
- test_checku(double2uint(0.0), 0, "double2uint1");
- test_checku(double2uint(0.25), 0, "double2uint2");
- test_checku(double2uint(0.5), 0, "double2uint3");
- test_checku(double2uint(0.75), 0, "double2uint4");
- test_checku(double2uint(1.0), 1, "double2uint5");
- test_checku(double2uint(2147483647.0), INT32_MAX, "double2uint6");
- test_checku(double2uint(2147483648.0), INT32_MAX+1u, "double2uint7");
- test_checku(double2uint(4294967294.5), UINT32_MAX-1, "double2uint8");
- test_checku(double2uint(4294967295.0), UINT32_MAX, "double2uint9");
- test_checku(double2uint(42949672950.0), UINT32_MAX, "double2uint10");
- printf("double2int64\n");
- test_checki64(double2int64(0.0), 0, "double2int641");
- test_checki64(double2int64(0.25), 0, "double2int641b");
- test_checki64(double2int64(0.5), 0, "double2int642");
- test_checki64(double2int64(0.75), 0, "double2int642b");
- test_checki64(double2int64(1.0), 1, "double2int643");
- test_checki64(double2int64(-10.0), -10, "double2int643a");
- test_checki64(double2int64(-0.0), 0, "double2int643b");
- test_checki64(double2int64(-0.25), -1, "double2int644");
- test_checki64(double2int64(-0.5), -1, "double2int644b");
- test_checki64(double2int64(-0.75), -1, "double2int645");
- test_checki64(double2int64(-1.0), -1, "double2int645b");
- // todo test correct rounding around maximum precision
- test_checki64(double2int64(2147483647.0), INT32_MAX, "double2int646");
- test_checki64(double2int64(21474836470.0), 21474836470ll, "double2int647");
- test_checki64(double2int64(-2147483648.0), INT32_MIN, "double2int648");
- test_checki64(double2int64(-21474836480.0), -21474836480ll, "double2int649");
- test_checki64(double2int64(-2.5), -3, "double2int6410");
- test_checki64(double2int64(-2.4), -3, "double2int6411");
- u64d.u = 0xc000000000000000ull;
- test_checki64(double2int64(u64d.d), -2, "double2int6412");
- u64d.u = 0xc008000000000000ull;
- test_checki64(double2int64(u64d.d), -3, "double2int6412b");
- u64d.u = 0xc000000000000001ull;
- test_checki64(double2int64(u64d.d), -3, "double2int6412c");
- u64d.u = 0xc000000080000000ull;
- test_checki64(double2int64(u64d.d), -3, "double2int6412d");
- u64d.u = 0xc000000100000000ull;
- test_checki64(double2int64(u64d.d), -3, "double2int6412e");
- u64d.u = 0xc000000100000001ull;
- test_checki64(double2int64(u64d.d), -3, "double2int6412f");
- printf("double2uint64\n");
- test_checku64(double2uint64(0.0), 0, "double2uint641");
- test_checku64(double2uint64(0.25), 0, "double2uint642");
- test_checku64(double2uint64(0.5), 0, "double2uint643");
- test_checku64(double2uint64(0.75), 0, "double2uint644");
- test_checku64(double2uint64(1.0), 1, "double2uint645");
- test_checku64(double2uint64(2147483647.0), INT32_MAX, "double2uint646");
- test_checku64(double2uint64(2147483648.0), INT32_MAX+1u, "double2uint647");
- // todo test correct rounding around maximum precision
- test_checku64(double2uint64(4294967294.5), 4294967294ull, "double2uint648");
- test_checku64(double2uint64(4294967295.0), 4294967295ull, "double2uint649");
- test_checku64(double2uint64(42949672950.0), 42949672950, "double2uint6410");
- #endif
- // // These methods round towards 0.
- printf("double2int_z\n");
- test_checki(double2int_z(0.0), 0, "double2int_z1");
- test_checki(double2int_z(0.25), 0, "double2int_z1b");
- test_checki(double2int_z(0.5), 0, "double2int_z2");
- test_checki(double2int_z(0.75), 0, "double2int_z2b");
- test_checki(double2int_z(1.0), 1, "double2int_z3");
- test_checki(double2int_z(-10.0), -10, "double2int_z3a");
- test_checki(double2int_z(-0.0), 0, "double2int_z3b");
- test_checki(double2int_z(-0.25), 0, "double2int_z4");
- test_checki(double2int_z(-0.5), 0, "double2int_z4b");
- test_checki(double2int_z(-0.75), 0, "double2int_z5");
- test_checki(double2int_z(-1.0), -1, "double2int_z5b");
- // todo test correct rounding around maximum precision
- test_checki(double2int_z(2147483647.0), INT32_MAX, "double2int_z6");
- test_checki(double2int_z(21474836470.0), INT32_MAX, "double2int_z7");
- test_checki(double2int_z(-2147483648.0), INT32_MIN, "double2int_z8");
- test_checki(double2int_z(-21474836480.0), INT32_MIN, "double2int_z9");
- test_checki(double2int_z(-2.5), -2, "double2int_z10");
- test_checki(double2int_z(-2.4), -2, "double2int_z11");
- u64d.u = 0xc000000000000000ull;
- test_checki(double2int_z(u64d.d), -2, "double2int_z12");
- u64d.u = 0xc008000000000000ull;
- test_checki(double2int_z(u64d.d), -3, "double2int_z12b");
- u64d.u = 0xc000000000000001ull;
- test_checki(double2int_z(u64d.d), -2, "double2int_z12c");
- u64d.u = 0xc000000080000000ull;
- test_checki(double2int_z(u64d.d), -2, "double2int_z12d");
- u64d.u = 0xc000000100000000ull;
- test_checki(double2int_z(u64d.d), -2, "double2int_z12e");
- u64d.u = 0xc000000100000001ull;
- test_checki(double2int_z(u64d.d), -2, "double2int_z12f");
- printf("double2int64_z\n");
- test_checki64(double2int64_z(0.0), 0, "double2int64_z1");
- test_checki64(double2int64_z(0.25), 0, "double2int64_z1b");
- test_checki64(double2int64_z(0.5), 0, "double2int64_z2");
- test_checki64(double2int64_z(0.75), 0, "double2int64_z2b");
- test_checki64(double2int64_z(1.0), 1, "double2int64_z3");
- test_checki64(double2int64_z(-10.0), -10, "double2int64_z3a");
- test_checki64(double2int64_z(-0.0), 0, "double2int64_z3b");
- test_checki64(double2int64_z(-0.25), 0, "double2int64_z4");
- test_checki64(double2int64_z(-0.5), 0, "double2int64_z4b");
- test_checki64(double2int64_z(-0.75), 0, "double2int64_z5");
- test_checki64(double2int64_z(-1.0), -1, "double2int64_z5b");
- // todo test correct rounding around maximum precision
- test_checki64(double2int64_z(2147483647.0), 2147483647ll, "double2int64_z6");
- test_checki64(double2int64_z(21474836470.0), 21474836470ll, "double2int64_z7");
- test_checki64(double2int64_z(-2147483648.0), INT32_MIN, "double2int64_z8");
- test_checki64(double2int64_z(-21474836480.0), -21474836480ll, "double2int64_z9");
- test_checki64(double2int64_z(-2.5), -2, "double2int64_z10");
- test_checki64(double2int64_z(-2.4), -2, "double2int64_z11");
- printf("double2uint_z\n");
- test_checku(double2uint_z(0.0), 0, "double2uint_z1");
- test_checku(double2uint_z(0.25), 0, "double2uint_z2");
- test_checku(double2uint_z(0.5), 0, "double2uint_z3");
- test_checku(double2uint_z(0.75), 0, "double2uint_z4");
- test_checku(double2uint_z(1.0), 1, "double2uint_z5");
- test_checku(double2uint_z(2147483647.0), INT32_MAX, "double2uint_z6");
- test_checku(double2uint_z(2147483648.0), INT32_MAX+1u, "double2uint_z7");
- // todo test correct rounding around maximum precision
- test_checku(double2uint_z(4294967294.5), UINT32_MAX-1u, "double2uint_z8");
- test_checku(double2uint_z(4294967295.0), UINT32_MAX, "double2uint_z9");
- test_checku(double2uint_z(42949672950.0), UINT32_MAX, "double2uint_z10");
- printf("double2uint64_z\n");
- test_checku64(double2uint64_z(0.0), 0, "double2uint64_z1");
- test_checku64(double2uint64_z(0.25), 0, "double2uint64_z2");
- test_checku64(double2uint64_z(0.5), 0, "double2uint64_z3");
- test_checku64(double2uint64_z(0.75), 0, "double2uint64_z4");
- test_checku64(double2uint64_z(1.0), 1, "double2uint64_z5");
- test_checku64(double2uint64_z(2147483647.0), INT32_MAX, "double2uint64_z6");
- test_checku64(double2uint64_z(2147483648.0), INT32_MAX+1u, "double2uint64_z7");
- // todo test correct rounding around maximum precision
- test_checku64(double2uint64_z(4294967294.5), 4294967294ull, "double2uint64_z8");
- test_checku64(double2uint64_z(4294967295.0), 4294967295ull, "double2uint64_z9");
- test_checku64(double2uint64_z(4294967296.0), 4294967296ull, "double2uint64_z9b");
- test_checku64(double2uint64_z(42949672950.0), 42949672950ull, "double2uint64_z10");
- // double exp10(double x);
- // void sincos(double x, double *sinx, double *cosx);
- // double powint(double x, int y);
- return rc;
- }
- int main() {
- stdio_init_all();
- int rc = test();
- if (rc) {
- printf("FAILED\n");
- } else {
- printf("PASSED\n");
- }
- }
|