Unreachable code in ef_j0.c differs from glibc

"\"Keith Packard\" via Newlib" <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
Newlib and glibc both inherited a bunch of libm code from the venerable
SunPro C library, and it's still possible to diff the sources and see
how little they have diverged...

In trying to discover why newlib's bessel functions for 32-bit floats
are less accurate than glibc's, I compared the source code and found
some strange differences. While none of these explain the precision
issue, it seems like there are bugs here to fix.

(- is newlib, + is glibc)

(line 81, in j0f)
-		if(ix>0x80000000) z = (invsqrtpi*cc)/__ieee754_sqrtf(x);
+		if(ix>0x48000000) z = (invsqrtpi*cc)/sqrtf(x);

(line 167 in y0f
-                if(ix>0x80000000) z = (invsqrtpi*ss)/__ieee754_sqrtf(x);
+		if(ix>0x48000000) z = (invsqrtpi*ss)/sqrtf(x);

Line 81 and line 167 look like bugs to me -- 'ix' is the float with the
sign bit masked off, so those conditions can never be true.

openlibm has a different value that has a comment:

        https://github.com/JuliaMath/openlibm/blob/master/src/e_j0f.c:

        if(ix>0x58000000) z = (invsqrtpi*cc)/sqrtf(x); /* |x|>2**49 */

Apple has the same value as newlib:

        https://opensource.apple.com/source/Libm/Libm-47.1/i386.subproj/e_j0f.c.auto.html

	if((unsigned long)ix>0x80000000ul) z = (invsqrtpi*cc)/sqrtf(x);

An older version from freebsd has the newlib value as well:

        web.mit.edu/freebsd/head/lib/msun/src/e_j0f.c

        if(ix>0x80000000) z = (invsqrtpi*cc)/sqrtf(x);

(line 174 in y0f)
-	if(ix<=0x32000000) {	/* x < 2**-27 */
+	if(ix<=0x39800000) {	/* x < 2**-13 */
 	    return(u00 + tpi*__ieee754_logf(x));
 	}
 	z = x*x;

Line 174 just seems like a missed optimization case; y0f for values <
2**-13 can be approximated with the shorter computation.

As to the accuracy issues, I haven't found the root cause yet.

--
-keith
signature.asc (application/pgp-signature, 832 B)
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEw4O3eCVWE9/bQJ2R2yIaaQAAABEFAl5xLJoACgkQ2yIaaQAA
ABFnMQ/8D25fpf9iXkOK+V8mTy+Ni3TsH/pxejKW9yjFkEpeUgizwW11BPPy/vGu
UvLvy/HMe4XiosLuG/7nweCzGJ/9QZCmtNG0BFpNWqLu6QDbXNAFatJ2LFP8z5RM
GyeZ+O4AJak52d+y6ZCTmkUdjXr7W2qv4qwkq14NxgAMG8XNzWhX7NzOltidSiVR
CEBvJULyc5A5AZXzKHJGSBoCVtuJAOgtWBPshnfQZ5M7Bnb2x2F2j+DcidnQ4sFX
ppXbkXpp0jbv3uBofIuWCwLMAAEbkPshA9uuhVtjWpqk5AR1ZlYfuIcz3epw3vYa
8cdP1JjSCJUbGPQSsdFW93S7rJ0yXfDh6GMJFyg5WkuUhkxgxnt/9SAb4ubBDq22
yp7bFMdwZgRSvwddguzKe8Vx6LNtQiai/FDpB52Yl3I2Fp+3Z9+Ydfd3d1WCRn9B
KvBzDPZVnMGryImpooK1WL4/DHiGFdtvNkEgE7+vf8KVmMz8fUjzf9hMHtEyx2/K
QzMT5mTJ1Cyk4DM+nRz+qBF7phNdwlMKLGnhtYPt5V0ABbmZrg7dCKwiAlR3Ma+p
Iqx6yd0x9xAB7YFRyiQ99HakILdt6WBpOCt5cEgyeo+g221d/BW84Aq8quh/YlAK
5/fSO2BsbzexBlLxhbUpSVkF2+lUVq7XrDUDX1ww2Paz8bhSoEg=
=0EMk
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.