Re: HEADSUP: math is broken with clang and optimization

From: Steve Kargl <sgk_at_troutmask.apl.washington.edu>
Date: Mon, 15 Feb 2021 12:49:13 -0800
On Sun, Feb 14, 2021 at 01:59:58PM -0800, Steve Kargl wrote:
> Just a headsup for anyone doing numerical work with
> FreeBSD-current.  clang with optimization of -O1 or
> higher produces wrong results.  Testing 1 million 
> complex values of ccoshf and limiting |z| < 20,
> shows
> 

This is either an in-ling bug or discarding a cast issue.
With everything in the same file so clang has dp_ccosh
available to it when compiling main.

void
dp_ccosh(double x, double y, double *re, double *im)
{
	*re = cosh(x) * cos(y);
	*im = sinh(x) * sin(y);
}

int
main(int argc, char *argv[])
{
   float complex f, z;
   double re, im, ur, ui;
   float x, y;
   float xmax;
...
   for (j = 0; j < NUM; j++) {

       x = xmax * rangef();
       y = xmax * rangef();
       z = CMPLXF(x,y);
       f = ccoshf(z);

       dp_ccosh((double)x, (double)y, &re, &im);


gives the wrong results.  Changing this to

int
main(int argc, char *argv[])
{
   float complex f, z;
   double re, im, ur, ui;
   float x, y;
   volatile float xv, yv;
   float xmax;
...
   for (j = 0; j < NUM; j++) {

       xv = x = xmax * rangef();
       yv = y = xmax * rangef();
       z = CMPLXF(x,y);
       f = ccoshf(z);

       dp_ccosh((double)xv, (double)yv, &re, &im);

gives the expected and correct results.

-- 
Steve
Received on Mon Feb 15 2021 - 19:49:15 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:27 UTC