[PATCH 23/25] math: Use erfc from CORE-MATH

Paul Zimmermann Paul.Zimmermann@inria.fr
Mon Sep 15 14:15:01 GMT 2025


       Hi DJ,

> > +  for (int i = 0; i < 22; i++)
> > +    if (x == exceptions[i][0])
> > +      return exceptions[i][1] + exceptions[i][2];
> 
> IMHO the need for this code implies that all your other algorithms are
> faulty, if you need to fix their errors...

not necessarily. Correct rounding is ensured using Ziv's algorithm:

1) [fast path] compute an approximation y of f(x) using say 16 guard bits,
   and an error bound e
2) [rounding test] if y-e and y+e round to the same value, return this value
3) [accurate path] using an approximation y of f(x) using a larger precision,
   and round it to the target precision

The correctness of the accurate path is validated by the knowledge of "hard-
to-round" inputs. However, if the accurate path returns a wrong result for some
hard-to-round input, it is sometimes more efficient to use it as an
exceptional value, than increasing the precision of the accurate path.

> The exception table could have been sorted, too.
> 
> > +  /* subnormal exceptions */
> > +  if (x == 0x1.a8f7bfbd15495p+4)
> > +    return fma (0x1p-1074, -0.25, 0x1.99ef5883f656cp-1024);
> 
> Could have been part of the exceptions table?

I'm not sure, since the output should be 0x1.99ef5883f656cp-1024 for rounding
to nearest and upward, and 0x1.99ef5883f6568p-1024 for roundings toward zero
and downward. For the other exceptional cases, we return round(yh+yl) where
yh+yl is a double-double approximation of erfc(x). Here since we are in the
subnormal case, I cannot find such yh and yl values.

Paul


More information about the Libc-alpha mailing list