[PACTH,libm] hypothl(x) mishandles subnormal numbers.

Dimitry Andric dim at FreeBSD.org
Tue Feb 9 23:26:40 UTC 2021



> On 10 Feb 2021, at 00:15, Steve Kargl <sgk at troutmask.apl.washington.edu> wrote:
> 
> On Sat, Feb 06, 2021 at 10:32:33PM +0100, Dimitry Andric wrote:
>> On 6 Feb 2021, at 22:04, Steve Kargl <sgk at troutmask.apl.washington.edu> wrote:
>>> 
>>> 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.
>>>> 
>>> Forgot to include that issue was identified from
>>> a bug report in the OpenLibm bug mailing list.
>>> 
>>> https://github.com/JuliaMath/openlibm/issues/224
>> 
>> I put this in <https://bugs.freebsd.org/253313>. Now the trick is to
>> figure out what is going on in e_hypotl.c... :)
>> 
> 
> 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.
> 
> Index: src/e_hypotl.c
> ===================================================================
> --- 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)==0) return a;
> -		t1=0;
> +		t1=1;
> 		SET_HIGH_WORD(t1,ESW(MAX_EXP-2));	/* t1=2^(MAX_EXP-2) */
> 		b *= t1;
> 		a *= t1;
> 

Ah, having looked at the glibc code, I had concluded something similar
in https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=253313#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

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 223 bytes
Desc: Message signed with OpenPGP
URL: <http://lists.freebsd.org/pipermail/freebsd-current/attachments/20210210/d32e3f38/attachment.sig>


More information about the freebsd-current mailing list