svn commit: r215237 - head/lib/msun/src

Alexander Best arundel at freebsd.org
Sat Nov 13 12:56:48 UTC 2010


On Sat Nov 13 10, Ulrich Spoerlein wrote:
> Author: uqs
> Date: Sat Nov 13 10:54:10 2010
> New Revision: 215237
> URL: http://svn.freebsd.org/changeset/base/215237
> 
> Log:
>   Fix bug in jn(3) and jnf(3) that led to -inf results

thank you very much for fixing this long outstanding issue.
you might want to have a look at [1], where two more issues have been reported.

cheers.
alex

[1] http://mailman.oakapple.net/pipermail/numeric-interest/2010-September/thread.html

>   
>   Explanation by Steve:
>   jn[f](n,x) for certain ranges of x uses downward recursion to compute
>   the value of the function.  The recursion sequence that is generated is
>   proportional to the actual desired value, so a normalization step is
>   taken.  This normalization is j0[f](x) divided by the zeroth sequence
>   member.  As Bruce notes, near the zeros of j0[f](x) the computed value
>   can have giga-ULP inaccuracy. I found for the 1st zero of j0f(x) only
>   the leading decimal digit is correct.  The solution to the issue is
>   fairly straight forward.  The zeros of j0(x) and j1(x) never coincide,
>   so as j0(x) approaches a zero, the normalization constant switches to
>   j1[f](x) divided by the 2nd sequence member.  The expectation is that
>   j1[f](x) is a more accurately computed value.
>   
>   PR:		bin/144306
>   Submitted by:	Steven G. Kargl <kargl at troutmask.apl.washington.edu>
>   Reviewed by:	bde
>   MFC after:	7 days
> 
> Modified:
>   head/lib/msun/src/e_jn.c
>   head/lib/msun/src/e_jnf.c
> 
> Modified: head/lib/msun/src/e_jn.c
> ==============================================================================
> --- head/lib/msun/src/e_jn.c	Sat Nov 13 10:38:06 2010	(r215236)
> +++ head/lib/msun/src/e_jn.c	Sat Nov 13 10:54:10 2010	(r215237)
> @@ -200,7 +200,12 @@ __ieee754_jn(int n, double x)
>  			}
>  	     	    }
>  		}
> -	    	b = (t*__ieee754_j0(x)/b);
> +		z = __ieee754_j0(x);
> +		w = __ieee754_j1(x);
> +		if (fabs(z) >= fabs(w))
> +		    b = (t*z/b);
> +		else
> +		    b = (t*w/a);
>  	    }
>  	}
>  	if(sgn==1) return -b; else return b;
> 
> Modified: head/lib/msun/src/e_jnf.c
> ==============================================================================
> --- head/lib/msun/src/e_jnf.c	Sat Nov 13 10:38:06 2010	(r215236)
> +++ head/lib/msun/src/e_jnf.c	Sat Nov 13 10:54:10 2010	(r215237)
> @@ -152,7 +152,12 @@ __ieee754_jnf(int n, float x)
>  			}
>  	     	    }
>  		}
> -	    	b = (t*__ieee754_j0f(x)/b);
> +		z = __ieee754_j0f(x);
> +		w = __ieee754_j1f(x);
> +		if (fabsf(z) >= fabsf(w))
> +		    b = (t*z/b);
> +		else
> +		    b = (t*w/a);
>  	    }
>  	}
>  	if(sgn==1) return -b; else return b;

-- 
a13x


More information about the svn-src-head mailing list