commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Christian Winter (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (MATH-364) Make Erf more precise in the tails by providing erfc
Date Fri, 12 Aug 2011 19:30:27 GMT

    [ https://issues.apache.org/jira/browse/MATH-364?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13084315#comment-13084315
] 

Christian Winter commented on MATH-364:
---------------------------------------

The basic idea is to keep the numbers in the calculation small in order to avoid shifting
digits out of the floating point register as this would reduce the accuracy of the final result.
Straightforward is to make use of erf(double) if f1 and f2 get close to zero, and to use erfc(double)
if f1 and f2 get close to +1 or if they get close to -1. Maybe the mixed cases can be handled
in an easier way.
I will come back with a new suggestion next week.

> Make Erf more precise in the tails by providing erfc
> ----------------------------------------------------
>
>                 Key: MATH-364
>                 URL: https://issues.apache.org/jira/browse/MATH-364
>             Project: Commons Math
>          Issue Type: Improvement
>    Affects Versions: 1.1, 1.2, 2.0, 2.1
>            Reporter: Christian Winter
>            Priority: Minor
>             Fix For: 3.0
>
>
> First I want to thank Phil Steitz for making Erf stable in the tails through adjusting
the choices in calculating the regularized gamma functions, see [Math-282|https://issues.apache.org/jira/browse/MATH-282].
However, the precision of Erf in the tails is limitted to fixed point precision because of
the closeness to +/-1.0, although the Gamma class could provide much more accuracy. Thus I
propose to add the methods erfc(double) and erf(double, double) to the class Erf:
> {code:borderStyle=solid}
> /**
>  * Returns the complementary error function erfc(x).
>  * @param x the value
>  * @return the complementary error function erfc(x)
>  * @throws MathException if the algorithm fails to converge
>  */
> public static double erfc(double x) throws MathException {
> double ret = Gamma.regularizedGammaQ(0.5, x * x, 1.0e-15, 10000);
> 	if (x < 0) {
> 		ret = -ret;
> 	}
> 	return ret;
> }
> /**
>  * Returns the difference of the error function values of x1 and x2.
>  * @param x1 the first bound
>  * @param x2 the second bound
>  * @return erf(x2) - erf(x1)
>  * @throws MathException
>  */
> public static double erf(double x1, double x2) throws MathException {
> 	if(x1>x2)
> 		return erf(x2, x1);
> 	if(x1==x2)
> 		return 0.0;
>     	
> 	double f1 = erf(x1);
> 	double f2 = erf(x2);
> 	
> 	if(f2 > 0.5)
> 		if(f1 > 0.5)
> 			return erfc(x1) - erfc(x2);
> 		else
> 			return (0.5-erfc(x2)) + (0.5-f1);
> 	else
> 		if(f1 < -0.5)
> 			if(f2 < -0.5)
> 				return erfc(-x2) - erfc(-x1);
> 			else
> 				return (0.5-erfc(-x1)) + (0.5+f2);
> 		else
> 			return f2 - f1;
> }
> {code} 
> Further this can be used to improve the NormalDistributionImpl through
> {code:borderStyle=solid}
> @Override
> public double cumulativeProbability(double x0, double x1) throws MathException {
> 	return 0.5 * Erf.erf(
> 			(x0 - getMean()) / (getStandardDeviation() * sqrt2),
> 			(x1 - getMean()) / (getStandardDeviation() * sqrt2) );
> }
> {code}

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message