1+ using ErrorFunctionFP64 ;
2+ using Microsoft . VisualStudio . TestTools . UnitTesting ;
3+ using MultiPrecision ;
4+
5+ namespace ErrorFunctionFP64Tests {
6+ [ TestClass ( ) ]
7+ public class ErrorSummary {
8+ [ TestMethod ( ) ]
9+ public void PlotErf ( ) {
10+ using StreamWriter sw = new ( "../../../../results/erf_approx.csv" ) ;
11+
12+ sw . WriteLine ( "x,y_expected,y_actual,error(abs),error(rate)" ) ;
13+
14+ MultiPrecision < Pow2 . N8 > maxrateerror = 0 ;
15+
16+ for ( double x = - 10 ; x <= 10 ; x += 1d / 1024 ) {
17+ double actual = ErrorFunction . Erf ( ( double ) x ) ;
18+ MultiPrecision < Pow2 . N8 > expetected = MultiPrecision < Pow2 . N8 > . Erf ( x ) ;
19+ MultiPrecision < Pow2 . N8 > error = MultiPrecision < Pow2 . N8 > . Abs ( expetected - actual ) ;
20+ MultiPrecision < Pow2 . N8 > rateerror = ( error != 0 ) ? error / MultiPrecision < Pow2 . N8 > . Abs ( expetected ) : 0 ;
21+
22+ if ( double . IsNormal ( actual ) ) {
23+ maxrateerror = MultiPrecision < Pow2 . N8 > . Max ( rateerror , maxrateerror ) ;
24+ }
25+
26+ sw . WriteLine ( $ "{ x } ,{ expetected : e20} ,{ actual } ,{ error : e8} ,{ rateerror : e8} ") ;
27+ }
28+
29+ Console . WriteLine ( $ "max error (rate): { maxrateerror : e8} ") ;
30+ }
31+
32+ [ TestMethod ( ) ]
33+ public void PlotErfc ( ) {
34+ using StreamWriter sw = new ( "../../../../results/erfc_approx.csv" ) ;
35+
36+ sw . WriteLine ( "x,y_expected,y_actual,error(abs),error(rate)" ) ;
37+
38+ MultiPrecision < Pow2 . N8 > maxrateerror = 0 ;
39+
40+ for ( double x = - 10 ; x <= 30 ; x += 1d / 1024 ) {
41+ double actual = ErrorFunction . Erfc ( ( double ) x ) ;
42+ MultiPrecision < Pow2 . N8 > expetected = MultiPrecision < Pow2 . N8 > . Erfc ( x ) ;
43+ MultiPrecision < Pow2 . N8 > error = MultiPrecision < Pow2 . N8 > . Abs ( expetected - actual ) ;
44+ MultiPrecision < Pow2 . N8 > rateerror = ( error != 0 ) ? error / MultiPrecision < Pow2 . N8 > . Abs ( expetected ) : 0 ;
45+
46+ if ( double . IsNormal ( actual ) ) {
47+ maxrateerror = MultiPrecision < Pow2 . N8 > . Max ( rateerror , maxrateerror ) ;
48+ }
49+
50+ sw . WriteLine ( $ "{ x } ,{ expetected : e20} ,{ actual } ,{ error : e8} ,{ rateerror : e8} ") ;
51+ }
52+
53+ Console . WriteLine ( $ "max error (rate): { maxrateerror : e8} ") ;
54+ }
55+
56+ [ TestMethod ( ) ]
57+ public void PlotInverseErf ( ) {
58+ using StreamWriter sw = new ( "../../../../results/inverf_approx.csv" ) ;
59+
60+ sw . WriteLine ( "x,y_expected,y_actual,error(abs),error(rate)" ) ;
61+
62+ MultiPrecision < Pow2 . N8 > maxrateerror = 0 ;
63+
64+ for ( double x = - 1023d / 1024 ; x < 1 ; x += 1d / 1024 ) {
65+ double actual = ErrorFunction . InverseErf ( ( double ) x ) ;
66+ MultiPrecision < Pow2 . N8 > expetected = MultiPrecision < Pow2 . N8 > . InverseErf ( x ) ;
67+ MultiPrecision < Pow2 . N8 > error = MultiPrecision < Pow2 . N8 > . Abs ( expetected - actual ) ;
68+ MultiPrecision < Pow2 . N8 > rateerror = ( error != 0 ) ? error / MultiPrecision < Pow2 . N8 > . Abs ( expetected ) : 0 ;
69+
70+ if ( double . IsNormal ( actual ) ) {
71+ maxrateerror = MultiPrecision < Pow2 . N8 > . Max ( rateerror , maxrateerror ) ;
72+ }
73+
74+ sw . WriteLine ( $ "{ x } ,{ expetected : e20} ,{ actual } ,{ error : e8} ,{ rateerror : e8} ") ;
75+ }
76+
77+ Console . WriteLine ( $ "max error (rate): { maxrateerror : e8} ") ;
78+ }
79+
80+ [ TestMethod ( ) ]
81+ public void PlotInverseErfc ( ) {
82+ using StreamWriter sw = new ( "../../../../results/inverfc_approx.csv" ) ;
83+
84+ sw . WriteLine ( "x,y_expected,y_actual,error(abs),error(rate)" ) ;
85+
86+ MultiPrecision < Pow2 . N8 > maxrateerror = 0 ;
87+
88+ for ( double x = Math . ScaleB ( 1 , - 1024 ) ; x < Math . ScaleB ( 1 , - 10 ) ; x *= 2 ) {
89+ double actual = ErrorFunction . InverseErfc ( ( double ) x ) ;
90+ MultiPrecision < Pow2 . N8 > expetected = MultiPrecision < Pow2 . N8 > . InverseErfc ( x ) ;
91+ MultiPrecision < Pow2 . N8 > error = MultiPrecision < Pow2 . N8 > . Abs ( expetected - actual ) ;
92+ MultiPrecision < Pow2 . N8 > rateerror = ( error != 0 ) ? error / MultiPrecision < Pow2 . N8 > . Abs ( expetected ) : 0 ;
93+
94+ if ( double . IsNormal ( actual ) ) {
95+ maxrateerror = MultiPrecision < Pow2 . N8 > . Max ( rateerror , maxrateerror ) ;
96+ }
97+
98+ sw . WriteLine ( $ "{ x } ,{ expetected : e20} ,{ actual } ,{ error : e8} ,{ rateerror : e8} ") ;
99+ }
100+
101+ for ( double x = 1d / 1024 ; x < 2 ; x += 1d / 1024 ) {
102+ double actual = ErrorFunction . InverseErfc ( ( double ) x ) ;
103+ MultiPrecision < Pow2 . N8 > expetected = MultiPrecision < Pow2 . N8 > . InverseErfc ( x ) ;
104+ MultiPrecision < Pow2 . N8 > error = MultiPrecision < Pow2 . N8 > . Abs ( expetected - actual ) ;
105+ MultiPrecision < Pow2 . N8 > rateerror = ( error != 0 ) ? error / MultiPrecision < Pow2 . N8 > . Abs ( expetected ) : 0 ;
106+
107+ if ( double . IsNormal ( actual ) ) {
108+ maxrateerror = MultiPrecision < Pow2 . N8 > . Max ( rateerror , maxrateerror ) ;
109+ }
110+
111+ sw . WriteLine ( $ "{ x } ,{ expetected : e20} ,{ actual } ,{ error : e8} ,{ rateerror : e8} ") ;
112+ }
113+
114+ Console . WriteLine ( $ "max error (rate): { maxrateerror : e8} ") ;
115+ }
116+ }
117+ }
0 commit comments