*Bug #13655 fixed - acos([2 %nan]) and asin([2 %nan]) returned wrong results (0 inste... 36/15836/2
Adeline CARNIS [Tue, 20 Jan 2015 07:54:48 +0000 (08:54 +0100)]
Change-Id: I7fdfda6c7172238427aac937c78c0e0573ea5597

scilab/CHANGES_5.5.X
scilab/modules/elementary_functions/src/fortran/wacos.f
scilab/modules/elementary_functions/src/fortran/wasin.f
scilab/modules/elementary_functions/tests/nonreg_tests/bug_13655.dia.ref [new file with mode: 0644]
scilab/modules/elementary_functions/tests/nonreg_tests/bug_13655.tst [new file with mode: 0644]
scilab/modules/elementary_functions/tests/unit_tests/asin.dia.ref
scilab/modules/elementary_functions/tests/unit_tests/asin.tst

index 00f1bf8..e51754a 100644 (file)
@@ -88,6 +88,9 @@ Scilab Bug Fixes
 
 * Bug #13640 fixed - Graphics in isoview mode were too small when they were in subplots.
 
+* Bug #13655 fixed - acos and asin returned wrong results when input argument was a matrix
+                     of size greater than 1 and containing at least one NaN value.
+
 * Bug #13673 fixed - Anti-aliasing of xpoly marks had not a proper render.
 
 * Bug #13674 fixed - User .wgetrc configuration file is now by-passed when ATOMS does not use a proxy.
index 3f50acc..1b64f43 100644 (file)
@@ -44,6 +44,8 @@ c http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 *     EXTERNAL FUNCTIONS
       double precision dlamch, logp1
       external         dlamch, logp1
+      integer          isanan
+      external         isanan
 
 *     CONSTANTS
       double precision LN2, PI, HALFPI, Across, Bcross
@@ -77,7 +79,7 @@ c http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
       y = abs(zi)
       szr = sign(1.d0,zr)
       szi = sign(1.d0,zi)
-
+            
 
       if (LINF .le. min(x,y) .and. max(x,y) .le. LSUP ) then
 *        we are in the safe region
@@ -124,8 +126,13 @@ c http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
                endif
             endif
          elseif (y .lt. LINF) then
-            ar = sqrt(y)
-            ai = ar
+             if (isanan(x).eq.1) then
+                 ar = x
+                 ai = y
+             else
+                 ar = sqrt(y)
+                 ai = ar
+             endif
          elseif (EPSM*y - 1.d0 .ge. x) then
             ar = HALFPI
             ai = LN2 + log(y)
@@ -133,7 +140,11 @@ c http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
             ar = atan(y/x)
             ai = LN2 + log(y) + 0.5d0*logp1((x/y)**2)
          else
-            ar = HALFPI
+             if (isanan(x).eq.1) then
+                 ar = x
+             else
+                 ar = HALFPI
+             endif
             A = sqrt(1.d0 + y**2)
             ai = 0.5d0*logp1(2.d0*y*(y+A))
          endif
index eab40b0..c1a7e58 100644 (file)
@@ -44,6 +44,8 @@ c
 *     EXTERNAL FUNCTIONS
       double precision dlamch, logp1
       external         dlamch, logp1
+      integer          isanan
+      external         isanan
 
 *     CONSTANTS
       double precision LN2, HALFPI, Across, Bcross
@@ -124,7 +126,11 @@ c
             endif
 
          elseif (y .lt. LINF) then
-            ar = HALFPI - sqrt(y)
+            if (isanan(x).eq.1) then
+               ar = x
+            else
+               ar = HALFPI - sqrt(y)
+            endif
             ai = sqrt(y)
 
          elseif (EPSM*y - 1.d0 .ge. x) then
@@ -144,6 +150,9 @@ c
 
 *     recover the signs
       ar = szr * ar
+      if (y.eq.0d00 .and. szr.gt.0d00) then
+          szi = - szi
+      endif
       ai = szi * ai
 
       end
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_13655.dia.ref b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_13655.dia.ref
new file mode 100644 (file)
index 0000000..1a1650b
--- /dev/null
@@ -0,0 +1,25 @@
+// ============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// ============================================================================
+// <-- Non-regression test for bug 13655 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13655
+//
+// <-- Short Description -->
+// acos and asin returned wrong results when input argument was a matrix of size 
+// greater than 1 and containing at least one NaN value.
+assert_checkequal(acos(%nan), %nan);
+assert_checkalmostequal(acos(2), 1.3169579*%i, [], 1.e-10);
+expected = [1.3169579*%i %nan];
+assert_checkalmostequal(acos([2, %nan]), expected, [], 1.e-10);
+assert_checkalmostequal(acos([2; %nan]), expected.', [], 1.e-10);
+assert_checkalmostequal(acos([0.5 %nan]), [1.0471976 %nan], [], 1.e-7);
+assert_checkequal(asin(%nan), %nan);
+assert_checkalmostequal(asin(2), %pi/2 - 1.3169579*%i, [], 1.e-10);
+expected = [%pi/2 - 1.3169579*%i, %nan];
+assert_checkalmostequal(asin([2 %nan]), expected, [], 1.e-10);
+assert_checkalmostequal(asin([2 %nan]'), expected.', [], 1.e-10);
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_13655.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_13655.tst
new file mode 100644 (file)
index 0000000..85f8018
--- /dev/null
@@ -0,0 +1,28 @@
+// ============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// ============================================================================
+
+// <-- Non-regression test for bug 13655 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13655
+//
+// <-- Short Description -->
+// acos and asin returned wrong results when input argument was a matrix of size
+// greater than 1 and containing at least one NaN value.
+
+assert_checkequal(acos(%nan), %nan);
+assert_checkalmostequal(acos(2), 1.3169579*%i, [], 1.e-10);
+expected = [1.3169579*%i %nan];
+assert_checkalmostequal(acos([2, %nan]), expected, [], 1.e-10);
+assert_checkalmostequal(acos([2; %nan]), expected.', [], 1.e-10);
+assert_checkalmostequal(acos([0.5 %nan]), [1.0471976 %nan], [], 1.e-7);
+
+assert_checkequal(asin(%nan), %nan);
+assert_checkalmostequal(asin(2), %pi/2 - 1.3169579*%i, [], 1.e-10);
+expected = [%pi/2 - 1.3169579*%i, %nan];
+assert_checkalmostequal(asin([2 %nan]), expected, [], 1.e-10);
+assert_checkalmostequal(asin([2 %nan]'), expected.', [], 1.e-10);
index 7ce6546..2c2f89d 100644 (file)
@@ -26,7 +26,7 @@ assert_checktrue(isnan(asin(%nan)));
 assert_checktrue(isnan(asin(-%nan)));
 // 4. Limit values
 // ===============
-assert_checkequal(imag(asin(%inf)),%inf);
+assert_checkequal(imag(asin(%inf)),-%inf);
 assert_checkequal(imag(asin(-%inf)),%inf);
 // 5. Properties
 // =============
index d1e404b..45c11ee 100644 (file)
@@ -40,7 +40,7 @@ assert_checktrue(isnan(asin(-%nan)));
 // 4. Limit values
 // ===============
 
-assert_checkequal(imag(asin(%inf)),%inf);
+assert_checkequal(imag(asin(%inf)),-%inf);
 assert_checkequal(imag(asin(-%inf)),%inf);