HEADSUP: math is broken with clang and optimization
Steve Kargl
sgk at troutmask.apl.washington.edu
Mon Feb 15 20:49:15 UTC 2021
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
More information about the freebsd-current
mailing list