These (diff below) seem to be obvious typos in k_sin.c,
but only in comments. The comment that says
if x < 2^-27 (hx<0x3e400000), return x with inexact if x!=0
also puzzles me a bit: what the code does is
GET_HIGH_WORD(ix,x);
ix &= 0x7fffffff; /* high word of x */
if(ix<0x3e400000) /* |x| < 2**-27 */
{if((int)x==0) return x;} /* generate inexact */
If the high word of a double x is less than 0x3e400000,
how could (int)x be anything else than zero?
The "if x!= 0" also puzzles me: the sine of zero _is_ zero, exactly.
What would change with this:
if (ix < 0x3e400000)
return x;
What is the role of the iy indicator?
Is it easier/faster to test the integer indicator for iy == 0
than it would be to test y == 0 itself? Or is there another reason?
Jan
Index: k_sin.c
===================================================================
RCS file: /cvs/src/lib/libm/src/k_sin.c,v
retrieving revision 1.3
diff -u -p -r1.3 k_sin.c
--- k_sin.c 27 Oct 2009 23:59:30 -0000 1.3
+++ k_sin.c 26 Sep 2017 16:07:45 -0000
@@ -10,15 +10,15 @@
* ====================================================
*/
-/* __kernel_sin( x, y, iy)
+/* __kernel_sin(x, y, iy)
* kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
- * Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
+ * Input iy indicates whether y is 0. (if iy=0, assume y to be 0).
*
* Algorithm
* 1. Since sin(-x) = -sin(x), we need only to consider positive x.
- * 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.
+ * 2. if x < 2^-27 (hx<0x3e400000), return x with inexact if x!=0.
* 3. sin(x) is approximated by a polynomial of degree 13 on
* [0,pi/4]
* 3 13