underflow handling in besselK (PR#2179)
maechler@stat.math.ethz.ch
maechler@stat.math.ethz.ch
Fri, 18 Oct 2002 17:16:38 +0200 (MET DST)
>>>>> "Ben" == Ben Bolker <bolker@zoo.ufl.edu>
>>>>> on Thu, 17 Oct 2002 19:58:33 +0200 (MET DST) writes:
Ben> The besselK() function knows about overflows/underflows internally;
Ben> there is a constant xmax_BESS_K in src/nmath/bessel.h (and referred to
Ben> only in bessel_k.c), equal to 705.342, which is checked if expon.scaled is
Ben> FALSE. (The equivalent number for bessel_i.c is 709, defined as
Ben> exparg_BESS in bessel.h.) However, besselK(x) silently returns +Inf if
x> 705.342. This behavior is reasonable for besselI (where the problem is
Ben> an overflow), but seems wrong for besselK (since the problem here is an
Ben> *underflow*). The answer may be as simple as returning 0 rather than +Inf
Ben> in this case.
Yes, indeed.
Ben> If this is appropriate, the following patch should do the job:
Ben>
Ben> <...........>
"R-patched" now contains something like your patch, namely :
if(ex <= 0 || (*ize == 1 && ex > xmax_BESS_K)) {
+ if(ex <= 0) {
ML_ERROR(ME_RANGE);
- *ncalc = *nb;
for(i=0; i < *nb; i++)
bk[i] = ML_POSINF;
+ } else /* would only have underflow */
+ for(i=0; i < *nb; i++)
+ bk[i] = 0.;
+ *ncalc = *nb;
return;
}
Thank you for the report!
Martin Maechler <maechler@stat.math.ethz.ch> http://stat.ethz.ch/~maechler/
Seminar fuer Statistik, ETH-Zentrum LEO C16 Leonhardstr. 27
ETH (Federal Inst. Technology) 8092 Zurich SWITZERLAND
phone: x-41-1-632-3408 fax: ...-1228 <><
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._