Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Feb 2021 00:26:29 +0100
From:      Dimitry Andric <dim@FreeBSD.org>
To:        Steve Kargl <sgk@troutmask.apl.washington.edu>
Cc:        FreeBSD Current <freebsd-current@freebsd.org>
Subject:   Re: [PACTH,libm] hypothl(x) mishandles subnormal numbers.
Message-ID:  <051767C6-85FB-48E8-AFE1-546DC41E8D17@FreeBSD.org>
In-Reply-To: <20210209231529.GA59891@troutmask.apl.washington.edu>
References:  <20210206203929.GA45801@troutmask.apl.washington.edu> <20210206210448.GC45801@troutmask.apl.washington.edu> <C5652F7E-A943-42AA-A70B-1D4C1C763E06@FreeBSD.org> <20210209231529.GA59891@troutmask.apl.washington.edu>

next in thread | previous in thread | raw e-mail | index | archive | help

--Apple-Mail=_0B1E5AAA-12E1-454C-B5BC-E07EFB1F349F
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=us-ascii



> On 10 Feb 2021, at 00:15, Steve Kargl =
<sgk@troutmask.apl.washington.edu> wrote:
>=20
> On Sat, Feb 06, 2021 at 10:32:33PM +0100, Dimitry Andric wrote:
>> On 6 Feb 2021, at 22:04, Steve Kargl =
<sgk@troutmask.apl.washington.edu> wrote:
>>>=20
>>> On Sat, Feb 06, 2021 at 12:39:29PM -0800, Steve Kargl wrote:
>>>> I've long forgotten by freebsd bugzilla password.
>>>> So, if someone would like to submit a bug report,
>>>> here's a test program.
>>>>=20
>>> Forgot to include that issue was identified from
>>> a bug report in the OpenLibm bug mailing list.
>>>=20
>>> https://github.com/JuliaMath/openlibm/issues/224
>>=20
>> I put this in <https://bugs.freebsd.org/253313>. Now the trick is to
>> figure out what is going on in e_hypotl.c... :)
>>=20
>=20
> This patch fixes the issue.  t1 is used to scale the subnormal
> numbers.  It is generated by scaling the exponent, but that
> only works if t1 is 1 not 0.
>=20
> Index: src/e_hypotl.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- src/e_hypotl.c	(revision 2342)
> +++ src/e_hypotl.c	(working copy)
> @@ -82,7 +82,7 @@ hypotl(long double x, long double y)
> 	        man_t manh, manl;
> 		GET_LDBL_MAN(manh,manl,b);
> 		if((manh|manl)=3D=3D0) return a;
> -		t1=3D0;
> +		t1=3D1;
> 		SET_HIGH_WORD(t1,ESW(MAX_EXP-2));	/* =
t1=3D2^(MAX_EXP-2) */
> 		b *=3D t1;
> 		a *=3D t1;
>=20

Ah, having looked at the glibc code, I had concluded something similar
in https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D253313#c2, but
using INSERT_LDBL80_WORDS(t1,ESW(MAX_EXP-2),0x8000000000000000).

Your solution is a lot simpler though. :) Note that to make it work, I
also needed to insert a volatile into the INSERT_LDBL80_WORDS() macro.

There are more places where this is apparently needed, due to the way
recent clang versions tend to over-optimize floating point code at
compile time. And specifically for the case where one union field is
written, and then another field read, sometimes leading to unexpected
results...

In any case, I will apply this soon, and also add a test case. Thanks!

-Dimitry


--Apple-Mail=_0B1E5AAA-12E1-454C-B5BC-E07EFB1F349F
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename=signature.asc
Content-Type: application/pgp-signature;
	name=signature.asc
Content-Description: Message signed with OpenPGP

-----BEGIN PGP SIGNATURE-----
Version: GnuPG/MacGPG2 v2.2

iF0EARECAB0WIQR6tGLSzjX8bUI5T82wXqMKLiCWowUCYCMaJQAKCRCwXqMKLiCW
o73NAJ4qj+xdXqSkJvl1RRpKA7+wd07m2gCeIpUAecU15Z3ZJc2GAEgju9k9xqQ=
=UJ9F
-----END PGP SIGNATURE-----

--Apple-Mail=_0B1E5AAA-12E1-454C-B5BC-E07EFB1F349F--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?051767C6-85FB-48E8-AFE1-546DC41E8D17>