Statistics: fix for cdfnor 64bits 05/12205/3
Paul BIGNIER [Wed, 31 Jul 2013 13:10:59 +0000 (15:10 +0200)]
In 64bits, cdfnor yielded a wrong result when input argument was %inf.

Change-Id: I1b78ffc18ba6a0e5b1217ad9856f915f42f918e0

scilab/modules/statistics/src/dcdflib/cdfnor.f
scilab/modules/statistics/tests/unit_tests/InfTests.dia.ref
scilab/modules/statistics/tests/unit_tests/InfTests.tst

index d0a7389..086eab6 100644 (file)
@@ -98,6 +98,8 @@ C
 C
 C**********************************************************************
 C     .. Parameters ..
+      DOUBLE PRECISION inf
+      PARAMETER (inf=1.0D300)
 C     ..
 C     .. Scalar Arguments ..
       DOUBLE PRECISION bound,mean,p,q,sd,x
@@ -207,7 +209,7 @@ C
                RETURN
             ENDIF
          ELSE
-            x = SIGN(1D308,x)
+            x = SIGN(inf,x)
          ENDIF
       ENDIF
 C
@@ -220,7 +222,7 @@ C
          CALL RETURNANANFORTRAN(sd)
          RETURN
       ENDIF
-      IF (vfinite(1,mean).EQ.0) mean = SIGN(1D308,mean)
+      IF (vfinite(1,mean).EQ.0) mean = SIGN(inf,mean)
 C
 C     SD
 C
@@ -231,7 +233,7 @@ C
          CALL RETURNANANFORTRAN(mean)
          RETURN
       ENDIF
-      IF (vfinite(1,sd).EQ.0) sd = SIGN(1D308,sd)
+      IF (vfinite(1,sd).EQ.0) sd = SIGN(inf,sd)
       IF (.NOT. (sd.LE.0.0D0)) GO TO 160
       bound = 0.0D0
       status = -6
index 8dbab28..820cc83 100644 (file)
@@ -69,11 +69,11 @@ assert_checkequal(res2, 0);
 assert_checkequal(res, 0);
 assert_checkequal(res2, 1);
 [res, res2] = cdfnor("PQ", 1, inf, 1);
-assert_checkequal(res, %nan);
-assert_checkequal(res2, %nan);
+assert_checkalmostequal(res, 0, tol);
+assert_checkalmostequal(res2, 1, tol);
 [res, res2] = cdfnor("PQ", 1, -inf, 1);
-assert_checkequal(res, %nan);
-assert_checkequal(res2, %nan);
+assert_checkalmostequal(res, 1, tol);
+assert_checkalmostequal(res2, 0, tol);
 // cdfpoi
 [res, res2] = cdfpoi("PQ", inf, 1);
 assert_checkequal(res, 1);
index 5bdaedb..eb52d26 100644 (file)
@@ -74,11 +74,11 @@ assert_checkequal(res2, 0);
 assert_checkequal(res, 0);
 assert_checkequal(res2, 1);
 [res, res2] = cdfnor("PQ", 1, inf, 1);
-assert_checkequal(res, %nan);
-assert_checkequal(res2, %nan);
+assert_checkalmostequal(res, 0, tol);
+assert_checkalmostequal(res2, 1, tol);
 [res, res2] = cdfnor("PQ", 1, -inf, 1);
-assert_checkequal(res, %nan);
-assert_checkequal(res2, %nan);
+assert_checkalmostequal(res, 1, tol);
+assert_checkalmostequal(res2, 0, tol);
 
 // cdfpoi
 [res, res2] = cdfpoi("PQ", inf, 1);