diff options
author | Petr Baudis <pasky@suse.cz> | 2011-09-09 22:16:10 -0400 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2011-09-09 22:16:10 -0400 |
commit | 1248c1c41508387ff282b208636737e8cdc9b5b0 (patch) | |
tree | f2de6f410de805293483964814aa29efefbe8daa /sysdeps/ieee754/flt-32/e_jnf.c | |
parent | f19009c1551a396ee8eff96a83254243ce25a090 (diff) | |
download | glibc-1248c1c41508387ff282b208636737e8cdc9b5b0.tar.gz |
Fix jn precision
Diffstat (limited to 'sysdeps/ieee754/flt-32/e_jnf.c')
-rw-r--r-- | sysdeps/ieee754/flt-32/e_jnf.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/sysdeps/ieee754/flt-32/e_jnf.c b/sysdeps/ieee754/flt-32/e_jnf.c index de2e53de83..dd3d551a39 100644 --- a/sysdeps/ieee754/flt-32/e_jnf.c +++ b/sysdeps/ieee754/flt-32/e_jnf.c @@ -165,7 +165,16 @@ static float zero = 0.0000000000e+00; } } } - b = (t*__ieee754_j0f(x)/b); + /* j0() and j1() suffer enormous loss of precision at and + * near zero; however, we know that their zero points never + * coincide, so just choose the one further away from zero. + */ + 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; |