[Bug libquadmath/65757] gfortran gives incorrect result for anint with real*16 argument
sgk at troutmask dot apl.washington.edu
gcc-bugzilla@gcc.gnu.org
Tue Apr 14 17:26:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65757
--- Comment #2 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Tue, Apr 14, 2015 at 01:38:00AM +0000, kargl at gcc dot gnu.org wrote:
> Using -fdump-tree-original (and removing the IO code),
> one gets
>
> anintbug ()
> {
> real(kind=16) q1;
> real(kind=16) q2;
> real(kind=16) q3;
>
> q1 = 2.33181505644407999969482421875e+14;
> q2 = roundq (q1);
> q3 = 2.33181505644408e+14;
>
> }
>
> So, gfortran is calling the libquadmath routine roundq.
> I've changed the component from fortran to libquadmath.
> This also appears to fail with all versions of gfortran.
>
The following patch appears to fix this issue, but I
do not know the internals of __float128_t so the bit
twiddling may not be right.
Index: libquadmath/math/roundq.c
===================================================================
--- libquadmath/math/roundq.c (revision 222054)
+++ libquadmath/math/roundq.c (working copy)
@@ -69,7 +69,7 @@ roundq (__float128 x)
}
else
{
- uint64_t i = -1ULL >> (j0 - 48);
+ uint64_t i = -1ULL >> (j0 - 47);
if ((i1 & i) == 0)
/* X is integral. */
return x;
@@ -77,7 +77,7 @@ roundq (__float128 x)
if (huge + x > 0.0)
{
/* Raise inexact if x != 0. */
- uint64_t j = i1 + (1LL << (111 - j0));
+ uint64_t j = i1 + (1LL << (110 - j0));
if (j < i1)
i0 += 1;
i1 = j;
More information about the Gcc-bugs
mailing list