https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105101
Bug ID: 105101 Summary: incorrect rounding for sqrtq Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: libquadmath Assignee: unassigned at gcc dot gnu.org Reporter: tkoenig at gcc dot gnu.org Target Milestone: --- IEEE mandates correct rounding of square roots, and sqrtq rounds incorrectly for some values: #include <stdio.h> #include <gmp.h> #define MPFR_WANT_FLOAT128 #include <mpfr.h> #include <quadmath.h> #define NDIG 113 int main() { mpfr_t a, b, tst; gmp_randstate_t state; __float128 af, bf; gmp_randinit_mt (state); mpfr_set_default_prec (NDIG); mpfr_init (a); mpfr_init (b); mpfr_init (tst); for (int i=0; i<100; i++) { mpfr_urandom (a, state, MPFR_RNDN); mpfr_mul_ui (a, a, 3, MPFR_RNDN); mpfr_add_ui (a, a, 1, MPFR_RNDN); af = mpfr_get_float128 (a, MPFR_RNDN); mpfr_sqrt (b, a, MPFR_RNDN); bf = sqrtq (af); mpfr_set_float128 (tst, bf, MPFR_RNDN); if (!mpfr_equal_p (tst, b)) { printf ("sqrt("); mpfr_out_str (stdout, 16, 0, a, MPFR_RNDN); printf (") = "); mpfr_out_str (stdout, 16, 0, b, MPFR_RNDN); printf (" ! = "); mpfr_out_str (stdout, 16, 0, tst, MPFR_RNDN); printf ("\n"); } } return 0; } gives me sqrt(2.4e5658b5f6d2a1ec21e3829dd7f8) = 1.84bfedcba255aeaf7e99184e6f3b ! = 1.84bfedcba255aeaf7e99184e6f3a sqrt(1.a8942b9fcf73a7cc6d2546104e8f) = 1.49af594bb6630a9358d929e60a7b ! = 1.49af594bb6630a9358d929e60a7c sqrt(2.71ad677c998ff96c3a5af38b7ee0) = 1.9037796dd2ced85e3fde2112fe63 ! = 1.9037796dd2ced85e3fde2112fe62 sqrt(3.b8f47bfc809dc00ed76e72cc70a4) = 1.edeb6523391e23008db6386115d3 ! = 1.edeb6523391e23008db6386115d4 sqrt(1.48524d337f27113e25d7eee643b7) = 1.21ea0f970722185990c1a32be807 ! = 1.21ea0f970722185990c1a32be806 sqrt(1.c9e6c13fef31a052f5dba4c0d05e) = 1.5660ca59a7ad02740d08ec0ad237 ! = 1.5660ca59a7ad02740d08ec0ad236 sqrt(2.6c28926057d24449c618b8addbb4) = 1.8e729ca4cf7f6ab6f8cf2579a87b ! = 1.8e729ca4cf7f6ab6f8cf2579a87c sqrt(1.51c65cf9647952785b859500bf70) = 1.260ef5983614564e3fa636e0d493 ! = 1.260ef5983614564e3fa636e0d492 sqrt(2.cf6052559128965a96f542a8c462) = 1.ad239894bbd64edaa5de12f61265 ! = 1.ad239894bbd64edaa5de12f61264 sqrt(2.bfe5732cc879053f71c5240d026e) = 1.a87f27daa19d145bb1d2756750e5 ! = 1.a87f27daa19d145bb1d2756750e4 sqrt(3.66185a13cbb8d455463507813f6c) = 1.d7f53f5b2ad068de705fe4660697 ! = 1.d7f53f5b2ad068de705fe4660698 sqrt(2.5af21489bafdf81c0047850a69e0) = 1.88e114747ee2213bc2af2c6f572f ! = 1.88e114747ee2213bc2af2c6f572e sqrt(2.71c155bcdb555657ff0fe301660a) = 1.903dd936eb27661ee030b952dc2f ! = 1.903dd936eb27661ee030b952dc2e sqrt(1.74ed7ee5a244f1c8a45361664fb0) = 1.34fb3bfc3d55ca48fbffb9be113f ! = 1.34fb3bfc3d55ca48fbffb9be1140 sqrt(2.414fd19bd0495ab521274e316538) = 1.806fe03d3244345277e674340bdb ! = 1.806fe03d3244345277e674340bda sqrt(2.4853c8d694a5aa889070fdab21c6) = 1.82c40b824e75149ee39e9b1c8fed ! = 1.82c40b824e75149ee39e9b1c8fec sqrt(1.e6ae9218331623b1a8b2ceea4b22) = 1.60f95131df63442f9ba389039d55 ! = 1.60f95131df63442f9ba389039d54 sqrt(1.4dff0457856b9f2097275f9decbe) = 1.2468b38405610910a60929f0c895 ! = 1.2468b38405610910a60929f0c896 sqrt(3.e720f9998891f40b8a3d2207eb6c) = 1.f9be75953c96a035da06ccdc1e67 ! = 1.f9be75953c96a035da06ccdc1e66 sqrt(1.98d4defa4bf711b662d1a2bca893) = 1.43836938d7cb1c9cadaa6d69f11f ! = 1.43836938d7cb1c9cadaa6d69f11e sqrt(3.f2e46bf92ba492c9980ddfa4317e) = 1.fcb6674f25a5dc44b4b702a34d13 ! = 1.fcb6674f25a5dc44b4b702a34d14 sqrt(1.24e5a1865c0cbb6483d9ccd2ced0) = 1.11d3e6bd82323006686745d16fa1 ! = 1.11d3e6bd82323006686745d16fa0 sqrt(3.937ee06d6e7d373cf1d95f09e500) = 1.e41d51bcc6c6a8867a5819bb1a1b ! = 1.e41d51bcc6c6a8867a5819bb1a1c sqrt(2.83faa7963fffa7fbc9e246e0914e) = 1.96072460dd2c31680ca207682e4f ! = 1.96072460dd2c31680ca207682e50 sqrt(1.fdf4c95075ffdccec60afb6a74fb) = 1.6950bb2977940a3c7b6524ac62a5 ! = 1.6950bb2977940a3c7b6524ac62a4