Bug #14116 fixed - Invalid exponent in case of complex exponents especially 0*%i. 17/17917/5
Dhruv Khattar [Fri, 11 Mar 2016 15:11:12 +0000 (20:11 +0530)]
Change-Id: Ie1d244bdef3bc3ce3389985ca383ca2c5b60610d

scilab/CHANGES
scilab/modules/ast/includes/types/double.hxx
scilab/modules/ast/macros/%r_p_s.sci
scilab/modules/ast/src/cpp/operations/types_power.cpp
scilab/modules/ast/tests/nonreg_tests/bug_14116.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/nonreg_tests/bug_14116.tst [new file with mode: 0644]
scilab/modules/overloading/macros/%r_j_s.sci

index c30d0bd..ccb10f9 100644 (file)
@@ -349,6 +349,8 @@ In 6.0.0:
 
 * Bug #14111 fixed - modified lib function to detect Scilab version 5 libraries and give proper error messages.
 
+* Bug #14116 fixed - Invalid exponent in case of complex exponents especially 0*%i.
+
 * Bug #14271 fixed - conjgrad() displayed an incorrect error message about number of arguments.
 
 * Bug #14347 fixed - plot2d crashed with multiple entries (non regression test).
index c862338..1ace477 100644 (file)
@@ -83,6 +83,23 @@ public :
         return (m_pImgData != NULL) || isViewAsZComplex();
     }
 
+    inline bool isNumericallyComplex(double tolerance = 0)
+    {
+        if(isComplex())
+        {
+            int listSize = getSize();
+            double* bImg = getImg();
+            for(int i = 0; i < listSize; i++)
+            {
+                if(abs(bImg[i]) > tolerance)
+                {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
     bool isTrue();
 
     bool neg(InternalType *& out)
index 3f9ad09..9ae783c 100644 (file)
@@ -15,20 +15,16 @@ function f=%r_p_s(f,s)
     //!
 
     if s==[] then f=[],return,end
-    if or(imag(s)<>0)|or(int(s)<>s) then error(30),end
-
+    if or(imag(s)<>0)|or(int(s)<>s) then error(_("Invalid exponent: expected real exponents.")),end
+    s = real(s)
     [m,n]=size(f("num"))
     [ms,ns]=size(s)
     if ms==1&ns==1 then
         if m==1|n==1 then //Element wise exponentiation f.^s with f vector
-            if m>1|n>1&warning("query")=="on" then
-                //obsolescence warning
-                mprintf(_("  Warning: Syntax ""vector ^ scalar"" is obsolete it will be removed in scilab-6.\n           Use ""vector .^ scalar"" instead.\n"));
-            end
             if s<0 then
                 num=f("num")
                 if or(abs(coeff(num(:)))*ones(max(degree(num))+1,1)==0) then
-                    error(27)
+                    error(_("Division by zero"))
                 end
                 s=-s
                 f=rlist(f("den").^s,num.^s,f("dt"))
@@ -40,10 +36,11 @@ function f=%r_p_s(f,s)
             if s<0 then f=invr(f),s=-s,end
             f1=f;for k=2:s,f=f*f1;end
         else
-            error(20,1)
+        msg = _("%s: Argument #%d: Square matrix expected.\n")
+           error(sprintf(msg, "power" , 1));
         end
     elseif ms==1|ns==1 then // Element wise exponentiation f.^s with f "scalar"
-        if m<>1|n<>1 then error(43),end
+        if m<>1|n<>1 then error(_("Not implemented")),end
         kp=find(s>=0)
         kn=find(s<0)
         num=ones(s)
@@ -51,13 +48,24 @@ function f=%r_p_s(f,s)
         num(kp)=f("num").^s(kp)
         den(kp)=f("den").^s(kp)
         if abs(coeff(f("num")))*ones(degree(f("num"))+1,1)==0 then
-            error(27)
+            error(_("Division by zero"))
         end
         num(kn)=f("den").^(-s(kn))
         den(kn)=f("num").^(-s(kn))
         f=rlist(num,den,[])
+    elseif m==1&n==1 then // Element wise exponentiation f.^s with f "scalar"
+        kp=find(s>=0)
+        kn=find(s<0)
+        num=ones(s)
+        den=ones(s)
+        num(kp)=f("num").^s(kp)
+        den(kp)=f("den").^s(kp)
+        p=1/f
+        num(kn)=p("num").^(-s(kn))
+        den(kn)=p("den").^(-s(kn))
+        f=rlist(num,den,[])
     else
-        error(30)
+        error(_("Invalid exponent"))
     end
 
 endfunction
index 60b93a6..108d134 100644 (file)
@@ -63,7 +63,7 @@ InternalType *GenericPower(InternalType *_pLeftOperand, InternalType *_pRightOpe
             case 1 :
                 throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
             case 2 :
-                throw ast::InternalError(_W("Invalid exponent.\n"));
+                throw ast::InternalError(_W("Invalid exponent: expected real exponents.\n"));
             default:
                 //OK
                 break;
@@ -134,7 +134,7 @@ InternalType *GenericDotPower(InternalType *_pLeftOperand, InternalType *_pRight
             case 1 :
                 throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
             case 2 :
-                throw ast::InternalError(_W("Invalid exponent.\n"));
+                throw ast::InternalError(_W("Invalid exponent: expected real exponents.\n"));
             default:
                 //OK
                 break;
@@ -340,12 +340,12 @@ int PowerDoubleByDouble(Double* _pDouble1, Double* _pDouble2, Double** _pDoubleO
 int PowerPolyByDouble(Polynom* _pPoly, Double* _pDouble, InternalType** _pOut)
 {
     bool bComplex1  = _pPoly->isComplex();
-    bool bComplex2  = _pDouble->isComplex();
     bool bScalar1   = _pPoly->isScalar();
+    double* bImg    = _pDouble->getImg();
+    bool bNumericallyComplex1 = _pDouble->isNumericallyComplex();
 
-    if (bComplex2)
+    if(!bNumericallyComplex1)
     {
-        //invalid exponent.
         return 2;
     }
 
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14116.dia.ref b/scilab/modules/ast/tests/nonreg_tests/bug_14116.dia.ref
new file mode 100644 (file)
index 0000000..5f3c93a
--- /dev/null
@@ -0,0 +1,48 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Dhruv Khattar
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- ENGLISH IMPOSED -->
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 14116 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14116
+//
+// <-- Short Description -->
+// Invalid exponent in case of complex exponents especially(0*%i)
+// example x^(0*%i)
+x = poly(0,"x");
+s1 = 0*%i;
+s2 = 2 + 0*%i;
+s3 = [1 2 3 0*%i];
+s4 = [1 0*%i; 2 4];
+s5 = [1 2 4+0*%i 6];
+s6 = [1 3+0*%i; 2 4];
+assert_checkequal(x^s1, x^0);
+assert_checkequal(x^s2, x^2);
+assert_checkequal(x^s3, [x, x^2, x^3, 1]);
+assert_checkequal(x^s4, [x, 1; x^2, x^4]);
+assert_checkequal(x^s5, [x, x^2, x^4, x^6]);
+assert_checkequal(x^s6, [x, x^3; x^2, x^4]);
+assert_checkequal(x.^s1, x^0);
+assert_checkequal(x.^s2, x.^2);
+assert_checkequal(x.^s3, [x, x.^2, x.^3, 1]);
+assert_checkequal(x.^s4, [x, 1; x.^2, x.^4]);
+assert_checkequal(x.^s5, [x, x.^2, x.^4, x.^6]);
+assert_checkequal(x.^s6, [x, x.^3; x.^2, x.^4]);
+x = 1/x;
+assert_checkequal(x^s1, x^0);
+assert_checkequal(x^s2, x^2);
+assert_checkequal(x^s3, [x, x^2, x^3, 1]);
+assert_checkequal(x^s4, [x, 1; x^2, x^4]);
+assert_checkequal(x^s5, [x, x^2, x^4, x^6]);
+assert_checkequal(x^s6, [x, x^3; x^2, x^4]);
+assert_checkequal(x.^s1, x^0);
+assert_checkequal(x.^s2, x.^2);
+assert_checkequal(x.^s3, [x, x.^2, x.^3, 1]);
+assert_checkequal(x.^s4, [x, 1; x.^2, x.^4]);
+assert_checkequal(x.^s5, [x, x.^2, x.^4, x.^6]);
+assert_checkequal(x.^s6, [x, x.^3; x.^2, x.^4]);
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14116.tst b/scilab/modules/ast/tests/nonreg_tests/bug_14116.tst
new file mode 100644 (file)
index 0000000..6527098
--- /dev/null
@@ -0,0 +1,49 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Dhruv Khattar
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- ENGLISH IMPOSED -->
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 14116 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14116
+//
+// <-- Short Description -->
+// Invalid exponent in case of complex exponents especially(0*%i)
+// example x^(0*%i)
+
+x = poly(0,"x");
+s1 = 0*%i;
+s2 = 2 + 0*%i;
+s3 = [1 2 3 0*%i];
+s4 = [1 0*%i; 2 4];
+s5 = [1 2 4+0*%i 6];
+s6 = [1 3+0*%i; 2 4];
+assert_checkequal(x^s1, x^0);
+assert_checkequal(x^s2, x^2);
+assert_checkequal(x^s3, [x, x^2, x^3, 1]);
+assert_checkequal(x^s4, [x, 1; x^2, x^4]);
+assert_checkequal(x^s5, [x, x^2, x^4, x^6]);
+assert_checkequal(x^s6, [x, x^3; x^2, x^4]);
+assert_checkequal(x.^s1, x^0);
+assert_checkequal(x.^s2, x.^2);
+assert_checkequal(x.^s3, [x, x.^2, x.^3, 1]);
+assert_checkequal(x.^s4, [x, 1; x.^2, x.^4]);
+assert_checkequal(x.^s5, [x, x.^2, x.^4, x.^6]);
+assert_checkequal(x.^s6, [x, x.^3; x.^2, x.^4]);
+x = 1/x;
+assert_checkequal(x^s1, x^0);
+assert_checkequal(x^s2, x^2);
+assert_checkequal(x^s3, [x, x^2, x^3, 1]);
+assert_checkequal(x^s4, [x, 1; x^2, x^4]);
+assert_checkequal(x^s5, [x, x^2, x^4, x^6]);
+assert_checkequal(x^s6, [x, x^3; x^2, x^4]);
+assert_checkequal(x.^s1, x^0);
+assert_checkequal(x.^s2, x.^2);
+assert_checkequal(x.^s3, [x, x.^2, x.^3, 1]);
+assert_checkequal(x.^s4, [x, 1; x.^2, x.^4]);
+assert_checkequal(x.^s5, [x, x.^2, x.^4, x.^6]);
+assert_checkequal(x.^s6, [x, x.^3; x.^2, x.^4]);
index aba1b7c..f39b374 100644 (file)
@@ -14,14 +14,15 @@ function f=%r_j_s(f,s)
     //  p.^s for p rational matrix
     //!
     if s==[] then f=[],return,end
-    if  or(imag(s)<>0)|or(int(s)<>s) then error(30),end
+    if  or(imag(s)<>0)|or(int(s)<>s) then error(_("Invalid exponent: expected real exponents.")),end
+    s = real(s)
     [m,n]=size(f)
     [ms,ns]=size(s)
     if ms==1&ns==1 then
         if s<0 then
             num=f("num")
             if or(abs(coeff(num(:)))*ones(max(degree(num))+1,1)==0) then
-                error(27)
+                error(_("Division by zero"))
             end
             s=-s
             f=rlist(f("den").^s,f("num").^s,f("dt"))
@@ -49,13 +50,13 @@ function f=%r_j_s(f,s)
         den(kp)=den(kp).^s(kp)
 
         if or(abs(coeff(num(kn)))*ones(max(degree(num(kn)))+1,1)==0) then
-            error(27)
+            error(_("Division by zero"))
         end
         num(kn)=den(kn).^(-s(kn))
         den(kn)=num(kn).^(-s(kn))
         f=rlist(matrix(num,n,m),matrix(den,n,m),[])
     else
-        error(30)
+        error(_("Invalid Exponent"))
     end
 
 endfunction