* Bug 16617 fixed: gamma() extended to incomplete cases
[scilab.git] / scilab / modules / statistics / tests / unit_tests / cdfgam.tst
index ae8e3ae..0fa239b 100644 (file)
@@ -7,13 +7,16 @@
 // =============================================================================
 
 // <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
 // <-- ENGLISH IMPOSED -->
 
+// Run with test_run('statistics','cdfgam',['no_check_error_output']);
+
 //
 // Assessing the quality of the Normal distribution function
 // References
-//   Yalta, A. T. 2008. The accuracy of statistical distributions in Microsoft®Excel 2007. Comput. Stat. Data Anal. 52, 10 (Jun. 2008), 4579-4586. DOI= http://dx.doi.org/10.1016/j.csda.2008.03.005 
-//   Computation of Statistical Distributions (ELV), Leo Knüsel 
+//   Yalta, A. T. 2008. The accuracy of statistical distributions in Microsoft®Excel 2007. Comput. Stat. Data Anal. 52, 10 (Jun. 2008), 4579-4586. DOI= http://dx.doi.org/10.1016/j.csda.2008.03.005
+//   Computation of Statistical Distributions (ELV), Leo Knüsel
 // Table 5
 // Check Gamma distribution with parameters (x, alpha, beta = 1, Sigma = 1)
 //
 // Table of inputs from Yalta, 2008
 // [x shape scale P ]
 table = [
- 0.1 , 0.1 , 1 , 0.827552 
- 0.2 , 0.1 , 1 , 0.879420 
- 0.2 , 0.2 , 1 , 0.764435 
- 0.3 , 0.2 , 1 , 0.816527 
- 0.3 , 0.3 , 1 , 0.726957 
- 0.4 , 0.3 , 1 , 0.776381 
- 0.4 , 0.4 , 1 , 0.701441 
- 0.5 , 0.4 , 1 , 0.748019 
- 0.5 , 0.5 , 1 , 0.682689 
- 0.6 , 0.5 , 1 , 0.726678 
+0.1 , 0.1 , 1 , 0.827552
+0.2 , 0.1 , 1 , 0.879420
+0.2 , 0.2 , 1 , 0.764435
+0.3 , 0.2 , 1 , 0.816527
+0.3 , 0.3 , 1 , 0.726957
+0.4 , 0.3 , 1 , 0.776381
+0.4 , 0.4 , 1 , 0.701441
+0.5 , 0.4 , 1 , 0.748019
+0.5 , 0.5 , 1 , 0.682689
+0.6 , 0.5 , 1 , 0.726678
 ];
 
 precision = 1.e-5;
 ntests = size(table,"r");
 for i = 1 : ntests
-  x = table(i,1);
-  shape = table(i,2);
-  scale = table(i,3);
-  expected = table(i,4);
-  // Caution: this is the rate !
-  rate = 1/scale;
-  [computed,Q]=cdfgam("PQ",x,shape,rate);
-  assert_checkalmostequal ( computed , expected , precision );
-  assert_checkalmostequal ( Q , 1 - expected , precision );
+    x = table(i,1);
+    shape = table(i,2);
+    scale = table(i,3);
+    expected = table(i,4);
+    // Caution: this is the rate !
+    rate = 1/scale;
+    [computed,Q]=cdfgam("PQ",x,shape,rate);
+    assert_checkalmostequal ( computed , expected , precision );
+    assert_checkalmostequal ( Q , 1 - expected , precision );
 end
 
 // Table of inputs computed from R-2.8.1
@@ -70,10 +73,7 @@ table = [
 1.000000000000000000D+01 5.000000000000000000D-01 1.000000000000000000D+00 8.099910956089122777D-06 9.999922557835689840D-01 7.744216431044085842D-06
 2.000000000000000000D+01 5.000000000000000000D-01 1.000000000000000000D+00 2.600281868827196957D-10 9.999999997460371493D-01 2.539628589470869077D-10
 4.000000000000000000D+01 5.000000000000000000D-01 1.000000000000000000D+00 3.789795640412981196D-19 1.000000000000000000D+00 3.744097384202895045D-19
-//1.000000000000000000D+02 5.000000000000000000D-01 1.000000000000000000D+00 2.098828115677222045D-45 1.000000000000000000D+00 2.088487583762558879D-45
 3.000000000000000000D+02 5.000000000000000000D-01 1.000000000000000000D+00 1.67694904029982009D-132 1.000000000000000000D+00 1.67416798469182012D-132
-//5.000000000000000000D+02 5.000000000000000000D-01 1.000000000000000000D+00 1.79762504374667411D-219 1.000000000000000000D+00 1.79583278480075297D-219
-//1.000000000000000000D+03 5.000000000000000000D-01 1.000000000000000000D+00 0.000000000000000000D+00 1.000000000000000000D+00 0.000000000000000000D+00
 1.000000000000000021D-02 5.000000000000000000D-01 1.000000000000000000D+00 5.585758033944684620D+00 1.124629160182848975D-01 8.875370839817151580D-01
 1.000000000000000048D-04 5.000000000000000000D-01 1.000000000000000000D+00 5.641331674102550409D+01 1.128341555584961957D-02 9.887165844441503371D-01
 1.000000000000000021D-08 5.000000000000000000D-01 1.000000000000000000D+00 5.641895779058606422D+03 1.128379163334249004D-04 9.998871620836665697D-01
@@ -81,49 +81,57 @@ table = [
 9.999999999999999293D-41 5.000000000000000000D-01 1.000000000000000000D+00 5.641895835477568717D+19 1.128379167095512972D-20 1.000000000000000000D+00
 1.00000000000000002D-100 5.000000000000000000D-01 1.000000000000000000D+00 5.641895835477541988D+49 1.128379167095513082D-50 1.000000000000000000D+00
 9.99999999999999982D-201 5.000000000000000000D-01 1.000000000000000000D+00 5.641895835477511468D+99 1.12837916709551300D-100 1.000000000000000000D+00
-//1.00000000000000002D-300 5.000000000000000000D-01 1.000000000000000000D+00 5.64189583547731891D+149 1.12837916709551298D-150 1.000000000000000000D+00
-//0.000000000000000000D+00 5.000000000000000000D-01 1.000000000000000000D+00                     %inf 0.000000000000000000D+00 1.000000000000000000D+00
 ];
 
-// For the inversion of Shape, require only 8 digits, as 
-// a consequence of bug #7569: http://bugzilla.scilab.org/show_bug.cgi?id=7569
-//
 // Some tests do not pass:
-// http://bugzilla.scilab.org/show_bug.cgi?id=8031
-// http://bugzilla.scilab.org/show_bug.cgi?id=8030
+// http://bugzilla.scilab.org/8030
 //
 // Prints the number of accurate digits.
 
 precision = 1.e-12;
-precinverse = 1.e-8;
+precinverse = 1.e-14;
 
 ntests = size(table,"r");
 for i = 1 : ntests
-  x = table(i,1);
-  shape = table(i,2);
-  scale = table(i,3);
-  p = table(i,5);
-  q = table(i,6);
-  // Caution: this is the rate !
-  rate = 1/scale;
-  [p1,q1] = cdfgam("PQ",x,shape,rate);
-  x1      = cdfgam("X",shape,rate,p,q);
-  shape1  = cdfgam("Shape",rate,p,q,x);
-  rate1   = cdfgam("Rate",p,q,x,shape);
-  if ( %t ) then
-    assert_checkalmostequal ( p1 , p , precision );
-    assert_checkalmostequal ( q1 , q , precision );
-    assert_checkalmostequal ( x1 , x , precision );
-    assert_checkalmostequal ( shape1 , shape , precinverse );
-    assert_checkalmostequal ( rate1 , rate , precinverse );
-  end
-  if ( %f ) then
-    dp = assert_computedigits ( p1 , p );
-    dq = assert_computedigits ( q1 , q );
-    dx = assert_computedigits ( x1 , x );
-    ds = assert_computedigits ( shape1 , shape );
-    dr = assert_computedigits ( rate1 , rate );
-    mprintf("Test #%3d/%3d: Digits p1= %.1f, q1=%.1f, X= %.1f, S= %.1f, R= %.1f\n",i,ntests,dp,dq,dx,ds,dr);
-  end
+    x = table(i,1);
+    shape = table(i,2);
+    scale = table(i,3);
+    p = table(i,5);
+    q = table(i,6);
+    // Caution: this is the rate !
+    rate = 1/scale;
+    [p1,q1] = cdfgam("PQ",x,shape,rate);
+    x1      = cdfgam("X",shape,rate,p,q);
+    shape1  = cdfgam("Shape",rate,p,q,x);
+    rate1   = cdfgam("Rate",p,q,x,shape);
+    if ( %t ) then
+        assert_checkalmostequal ( p1 , p , precision );
+        assert_checkalmostequal ( q1 , q , precision );
+        assert_checkalmostequal ( x1 , x , precision );
+        assert_checkalmostequal ( shape1 , shape , precinverse );
+        assert_checkalmostequal ( rate1 , rate , precinverse );
+    end
+    if ( %f ) then
+        dp = assert_computedigits ( p1 , p );
+        dq = assert_computedigits ( q1 , q );
+        dx = assert_computedigits ( x1 , x );
+        ds = assert_computedigits ( shape1 , shape );
+        dr = assert_computedigits ( rate1 , rate );
+        mprintf("Test #%3d/%3d: Digits p1= %.1f, q1=%.1f, X= %.1f, S= %.1f, R= %.1f\n",i,ntests,dp,dq,dx,ds,dr);
+    end
 end
 
+// IEEE support
+// See http://bugzilla.scilab.org/7296
+Shape = 0;
+Rate = 1;
+
+X = %inf; // Inf
+[P, Q] = cdfgam("PQ", X, Shape, Rate);
+assert_checkequal(P, 1);
+assert_checkequal(Q, 0);
+
+X = %nan; // NaN
+[P, Q] = cdfgam("PQ", X, Shape, Rate);
+assert_checkequal(P, %nan);
+assert_checkequal(Q, %nan);