home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!ukma!cs.widener.edu!dsinc!ub!acsu.buffalo.edu!usenet
- From: jones@acsu.buffalo.edu (Terry A. Jones)
- Newsgroups: comp.unix.bsd
- Subject: Re: Where are the functions erf(), and erfc()?
- Message-ID: <Bx9vtF.2Bo@acsu.buffalo.edu>
- Date: 6 Nov 92 02:20:02 GMT
- References: <Bwz4qG.9p6@acsu.buffalo.edu>
- Sender: nntp@acsu.buffalo.edu
- Organization: State University of New York at Buffalo/Comp Sci
- Lines: 117
- Nntp-Posting-Host: hyades.cs.buffalo.edu
-
-
- Well I did not get any feedback on this one so I implemented
- the functions myself. I couldn't wait to get Spice compiled. Cut into
- erf.c, compile and add to your libm.a if you like.
-
- Terry Jones jones@cs.buffalo.edu
-
- ---------------------------cut here-----------------------------------------
- #include "mathimpl.h"
-
- /*
- * Predefined terms in expansion series for the error function.
- */
- #define T2 0.6666667
- #define T3 0.2666667
- #define T4 0.07619048
- #define T5 0.01693122
- #define T6 3.078403e-3
- #define T7 4.736005e-4
- #define T8 6.314673e-5
- #define T9 7.429027e-6
- #define T10 7.820028e-7
- #define T11 7.447646e-8
- #define T12 6.476214e-9
-
- /*
- * Internal version of the error function.
- */
- static double errorf( x )
- double x;
- {
- double x2;
-
- x2 = x * x;
-
- return( ( 2.0 * exp( -x2 ) / sqrt( M_PI ) ) * ( x * ( 1 + x2 * ( T2 + x2 *
- ( T3 + x2 *( T4 + x2 *( T5 + x2 *( T6 + x2 *( T7 + x2 *( T8 + x2 *
- ( T9 + x2 *( T10 + x2 *( T11 + x2 * T12)))))))))))));
- }
-
-
- /*
- * Compute the complement to the error function.
- */
- static double errorf_complement( x )
- double x;
- {
- double x2;
- double v;
-
- x2 = x * x;
- v = 1.0 / ( 2.0 * x2 );
-
- return( 1.0 / ( exp( x2 ) * x * sqrt( M_PI ) * ( 1 + v / ( 1 + 2 * v /
- ( 1 + 3 * v / ( 1 + 4 * v / ( 1 + 5 * v / ( 1 + 6 * v /
- ( 1 + 7 * v / ( 1 + 8 * v / ( 1 + 9 * v / ( 1 + 10 * v /
- ( 1 + 11 * v / ( 1 + 12 * v / ( 1 + 13 * v / ( 1 + 14 * v /
- ( 1 + 15 * v / ( 1 + 16 * v / ( 1 + 17 * v )))))))))))))))))));
- }
-
- /*
- * Global entry point for the error function.
- */
- double xerf( x )
- double x;
- {
- double sign;
-
- if ( 0.0 == x )
- return( 0.0 );
-
- /*
- * Handle case of negative argument.
- */
- if ( x < 0.0 )
- {
- sign = -1.0;
- x = -x;
- }
-
- else
- sign = 1.0;
-
- if ( x < 1.5 )
- return( errorf( x ) * sign );
- else
- return( ( 1.0 - errorf_complement( x )) * sign );
-
- }
-
- /*
- * Global entry point for the error function complement.
- */
- double xerfc( x )
- double x;
- {
-
- if ( 0.0 == x )
- return( 1.0 );
-
- if ( x < 0.0 )
- {
- x = -x;
- if ( x < 1.5 )
- return( 1.0 + errorf( x ) );
- else
- return( 2.0 - errorf_complement( x ) );
- }
-
- else
- {
- if ( x < 1.5 )
- return( 1.0 - errorf( x ) );
- else
- return( errorf_complement( x ) );
- }
- }
-