Bug #9976: The cdfbet function returned wrong value instead of 0. 46/8746/2
Adeline CARNIS [Mon, 20 Aug 2012 11:08:51 +0000 (13:08 +0200)]
Change-Id: Ic9970d9d5fd1cf80e8601e16fc0f02dc2aac2859

scilab/CHANGES_5.4.X
scilab/modules/statistics/src/dcdflib/dzror.f
scilab/modules/statistics/tests/nonreg_tests/bug_9976.dia.ref [new file with mode: 0644]
scilab/modules/statistics/tests/nonreg_tests/bug_9976.tst [new file with mode: 0644]
scilab/modules/statistics/tests/unit_tests/cdfbet.dia.ref
scilab/modules/statistics/tests/unit_tests/cdfbet.tst

index f1bb168..3c1ac81 100644 (file)
@@ -52,6 +52,8 @@ Bug Fixes
 * Bug #8488 fixed - NaN values was propagated when we performed the min/max between
                     several matrices.
 
+* Bug #9976 fixed - The inverse cdfbet function returned wrong value instead of 0.
+
 * Bug #11411 fixed - save function used unsigned char to store length of string.
                      Now it is an integer.
 
index 06e8b21..caafd7b 100644 (file)
@@ -80,10 +80,11 @@ C     .. Intrinsic Functions ..
       INTRINSIC abs,max,sign
 C     ..
 C     .. Statement Functions ..
-      DOUBLE PRECISION ftol
+      DOUBLE PRECISION ftol,dlamch
 C     ..
 C     .. Statement Function definitions ..
       ftol(zx) = 0.5D0*max(abstol,reltol*abs(zx))
+      eps = dlamch('e')
 C     ..
 C     .. Executable Statements ..
 
@@ -183,6 +184,11 @@ C
       b = b + w
       xlo = b
       x = xlo
+      if (x.lt.eps) then
+        x=0
+        status = 0
+        return
+      endif
 C     GET-FUNCTION-VALUE
 c      ASSIGN 200 TO i99999
       i99999=3
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_9976.dia.ref b/scilab/modules/statistics/tests/nonreg_tests/bug_9976.dia.ref
new file mode 100644 (file)
index 0000000..b105da2
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 9976 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9976
+//
+// <-- Short Description -->
+//    The inverse cdfbet function returned wrong value instead 0
+// =============================================================================
+a = 1;
+b = 2;
+p = 0;
+q = 1-p;
+x = cdfbet("XY",a,b,p,q);
+assert_checkequal(x, 0);
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_9976.tst b/scilab/modules/statistics/tests/nonreg_tests/bug_9976.tst
new file mode 100644 (file)
index 0000000..c79dcb0
--- /dev/null
@@ -0,0 +1,24 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 9976 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9976
+//
+// <-- Short Description -->
+//    The inverse cdfbet function returned wrong value instead of 0
+// =============================================================================
+
+a = 1;
+b = 2;
+p = 0;
+q = 1-p;
+x = cdfbet("XY",a,b,p,q);
+assert_checkequal(x, 0);
index fcbfd27..0686948 100644 (file)
@@ -1,9 +1,11 @@
 // =============================================================================
-// Tests for beta distribution
-//
-// Scilab Team
-// Copyright INRIA
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) ????-2008 - INRIA
 //
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// =============================================================================
+// Tests for beta distribution
 // =============================================================================
 prec = 1.e-5;
 A  = 2;
@@ -12,22 +14,21 @@ bn = 1;
 deff('[y]=Beta(x)','y=bn*(x^(A-1) * (1-x)^(B-1))');
 bn = intg(0,1,Beta);
 bn = 1/bn;
-if norm(intg(0,1,Beta)-1)> prec then bugmes();quit;end
+assert_checkequal(intg(0,1,Beta), 1);
 x  = 0:0.1:1;
 y  = 1-x;
 p1 = [];
 for k=x
-       p1=[p1,intg(0,k,Beta)];
+    p1=[p1,intg(0,k,Beta)];
 end
 A = 2*ones(x);
 B = 3*ones(x);
 [p,q]=cdfbet('PQ',x,y,A,B);
-if norm(p-p1) > prec then bugmes();quit;end
+assert_checkalmostequal(p, p1);
 [x1,y1]=cdfbet('XY',A,B,p,q);
-if norm(x-x1) > prec then bugmes();quit;end
-if norm(y-y1) > prec then bugmes();quit;end
+assert_checkalmostequal(x, x1);
+assert_checkalmostequal(y, y1);
 A1 = cdfbet('A',B,p,q,x,y);
-// x=0 or x=1 do not work
-if norm(A1(2:$-1)-A(2:$-1)) > prec then bugmes();quit;end
+assert_checkalmostequal(A1(2:$-1), A(2:$-1));
 B1 = cdfbet('B',p,q,x,y,A);
-if norm(B1(2:$-1)-B(2:$-1)) > prec then bugmes();quit;end
+assert_checkalmostequal(B1(2:$-1), B(2:$-1));
index 458ad8b..15eec43 100644 (file)
@@ -19,15 +19,14 @@ deff('[y]=Beta(x)','y=bn*(x^(A-1) * (1-x)^(B-1))');
 
 bn = intg(0,1,Beta);
 bn = 1/bn;
-
-if norm(intg(0,1,Beta)-1)> prec then pause,end
+assert_checkequal(intg(0,1,Beta), 1);
 
 x  = 0:0.1:1;
 y  = 1-x;
 p1 = [];
 
 for k=x
-       p1=[p1,intg(0,k,Beta)];
+    p1=[p1,intg(0,k,Beta)];
 end
 
 A = 2*ones(x);
@@ -35,15 +34,15 @@ B = 3*ones(x);
 
 [p,q]=cdfbet('PQ',x,y,A,B);
 
-if norm(p-p1) > prec then pause,end
+assert_checkalmostequal(p, p1);
 
 [x1,y1]=cdfbet('XY',A,B,p,q);
 
-if norm(x-x1) > prec then pause,end
-if norm(y-y1) > prec then pause,end
+assert_checkalmostequal(x, x1);
+assert_checkalmostequal(y, y1);
 
 A1 = cdfbet('A',B,p,q,x,y);
-// x=0 or x=1 do not work 
-if norm(A1(2:$-1)-A(2:$-1)) > prec then pause,end
+assert_checkalmostequal(A1(2:$-1), A(2:$-1));
+
 B1 = cdfbet('B',p,q,x,y,A);
-if norm(B1(2:$-1)-B(2:$-1)) > prec then pause,end
+assert_checkalmostequal(B1(2:$-1), B(2:$-1));