* Bug #12373 fixed - pmodulo(n,m<0) returned a negative result. 61/10761/2
Samuel GOUGEON [Sun, 10 Mar 2013 17:09:30 +0000 (18:09 +0100)]
Change-Id: I0c32a19dd266fd83c826f7aff47d5fda1ee74aa4

scilab/CHANGES_5.4.X
scilab/modules/elementary_functions/help/en_US/modulo.xml
scilab/modules/elementary_functions/help/fr_FR/modulo.xml
scilab/modules/elementary_functions/help/ja_JP/modulo.xml
scilab/modules/elementary_functions/help/pt_BR/modulo.xml
scilab/modules/elementary_functions/help/ru_RU/modulo.xml
scilab/modules/elementary_functions/macros/pmodulo.sci

index e8d8ca6..a684be3 100644 (file)
@@ -515,6 +515,8 @@ Bug fixes
 * Bug #12354 fixed - In SciNotes, invalid function with a semicolon after args
                      declaration.
 
+* Bug #12373 fixed - pmodulo(n,m<0) returned a negative result.
+
 
                     Changes between version 5.3.3 and 5.4.0
                     =======================================
index b6d7298..c34b63f 100644 (file)
@@ -2,6 +2,7 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
+ * Copyright (C) 2013 - Samuel GOUGEON
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
@@ -56,8 +57,8 @@
             if <varname>n</varname> or <varname>m</varname> are negative.
         </para>
         <para>
-            <function>pmodulo</function> computes <code>i = n - m .* floor (n
-                ./ m)
+            <function>pmodulo</function> computes <code>i = n - |m| .* floor (n
+                ./ |m|)
             </code>
             , the answer is positive or zero.
         </para>
     <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[ 
-n=[1,2,10,15];m=[2,2,3,5];
+n = [1,2,10,15];
+m = [2,2,3,5];
 modulo(n,m)
 
-modulo(-3,9)
-pmodulo(-3,9)
+modulo(-3, 9)
+modulo(10, -4)
+
+pmodulo(-3, 9)
+pmodulo(10, -6)
+pmodulo(-10, -6)
  ]]></programlisting>
     </refsection>
 </refentry>
index bc42662..a6a2d39 100644 (file)
@@ -1,4 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2008 - INRIA
+ * Copyright (C) 2013 - Samuel GOUGEON
+ * 
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at    
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ -->
 <refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="modulo" xml:lang="fr">
     <refnamediv>
         <refname>modulo</refname>
@@ -10,8 +22,8 @@
     </refnamediv>
     <refsynopsisdiv>
         <title>Séquence d'appel</title>
-        <synopsis>i=modulo(n,m)</synopsis>
-        <synopsis>i=pmodulo(n,m)</synopsis>
+        <synopsis>i = modulo(n,m)</synopsis>
+        <synopsis>i = pmodulo(n,m)</synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Paramètres</title>
@@ -42,8 +54,8 @@
             <literal>n</literal> et/ou <literal>m</literal> sont négatifs.
         </para>
         <para>
-            <literal>pmodulo</literal> calcule <literal>i = n - m .* floor (n ./
-                m)
+            <literal>pmodulo</literal> calcule <literal>i = n - |m| .* floor (n ./
+                |m|)
             </literal>
             ,la réponse est positive ou nulle.
         </para>
     <refsection>
         <title>Exemples</title>
         <programlisting role="example"><![CDATA[ 
-n=[1,2,10,15];m=[2,2,3,5];
+n = [1,2,10,15];
+m = [2,2,3,5];
 modulo(n,m)
 
-modulo(-3,9)
-pmodulo(-3,9)
+modulo(-3, 9)
+modulo(10, -4)
+
+pmodulo(-3, 9)
+pmodulo(10, -6)
+pmodulo(-10, -6)
  ]]></programlisting>
     </refsection>
 </refentry>
index dc1de0b..986f2c7 100644 (file)
@@ -2,6 +2,7 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
+ * Copyright (C) 2013 - Samuel GOUGEON
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
@@ -49,8 +50,8 @@
             答えが負となる可能性があります.
         </para>
         <para>
-            <literal>pmodulo</literal> は <literal>i = n - m .* floor (n
-                ./ m)
+            <literal>pmodulo</literal> は <literal>i = n - |m| .* floor (n
+                ./ |m|)
             </literal>
             を計算します, 答えは正またはゼロとなります.
         </para>
     <refsection>
         <title>例</title>
         <programlisting role="example"><![CDATA[ 
-n=[1,2,10,15];m=[2,2,3,5];
+n = [1,2,10,15];
+m = [2,2,3,5];
 modulo(n,m)
 
-modulo(-3,9)
-pmodulo(-3,9)
+modulo(-3, 9)
+modulo(10, -4)
+
+pmodulo(-3, 9)
+pmodulo(10, -6)
+pmodulo(-10, -6)
  ]]></programlisting>
     </refsection>
 </refentry>
index bd26887..d2390ae 100644 (file)
@@ -2,6 +2,7 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
+ * Copyright (C) 2013 - Samuel GOUGEON
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
@@ -48,8 +49,8 @@
             <literal>n</literal> ou <literal>m</literal> são negativos.
         </para>
         <para>
-            <literal>pmodulo</literal> computa <literal>i = n - m .* floor (n ./
-                m)
+            <literal>pmodulo</literal> computa <literal>i = n - |m| .* floor (n ./
+                |m|)
             </literal>
             ,a resposta é positiva ou zero.
         </para>
     <refsection>
         <title>Exemplos</title>
         <programlisting role="example"><![CDATA[ 
-n=[1,2,10,15];m=[2,2,3,5];
+n = [1,2,10,15];
+m = [2,2,3,5];
 modulo(n,m)
 
-modulo(-3,9)
-pmodulo(-3,9)
+modulo(-3, 9)
+modulo(10, -4)
+
+pmodulo(-3, 9)
+pmodulo(10, -6)
+pmodulo(-10, -6)
  ]]></programlisting>
     </refsection>
 </refentry>
index d9111ce..6f0f064 100644 (file)
@@ -2,6 +2,7 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
+ * Copyright (C) 2013 - Samuel GOUGEON
  *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
             являются отрицательными.
         </para>
         <para>
-            <function>pmodulo</function> вычисляет <code>i = n - m .* floor (n
-                ./ m)
+            <function>pmodulo</function> вычисляет <code>i = n - |m| .* floor (n
+                ./ |m|)
             </code>
             , ответ является положительным либо равным нулю.
         </para>
         <para>
-          <code>modulo(x,0)</code> возвращает сообщение об ошибке: "Деление на нуль...". При <code>ieee(2)</code>, <code>modulo(x,0)</code> возвращает <constant>%nan</constant>.
+            <code>modulo(x,0)</code> возвращает сообщение об ошибке: "Деление на нуль...". При <code>ieee(2)</code>, <code>modulo(x,0)</code> возвращает <constant>%nan</constant>.
         </para>
         <para>
             <code>pmodulo(x,0)</code> возвращает сообщение об ошибке: "Деление на нуль...". При <code>ieee(2)</code>, <code>pmodulo(x,0)</code> возвращает <constant>%nan</constant>.
     <refsection>
         <title>Примеры</title>
         <programlisting role="example"><![CDATA[
-n=[1,2,10,15];m=[2,2,3,5];
+n = [1,2,10,15];
+m = [2,2,3,5];
 modulo(n,m)
 
-modulo(-3,9)
-pmodulo(-3,9)
+modulo(-3, 9)
+modulo(10, -4)
+
+pmodulo(-3, 9)
+pmodulo(10, -6)
+pmodulo(-10, -6)
  ]]></programlisting>
     </refsection>
 </refentry>
index fdecb10..670a8c9 100644 (file)
@@ -1,57 +1,54 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
-// Copyright (C) INRIA\r
-// Copyright (C) DIGITEO - 2011 - Allan CORNET\r
-// Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS\r
-// \r
-// This file must be used under the terms of the CeCILL.\r
-// This source file is licensed as described in the file COPYING, which\r
-// you should have received as part of this distribution.  The terms\r
-// are also available at\r
-// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt\r
-\r
-function i = pmodulo(n, m)\r
-    //i=pmodulo(n,m) the "positive modulo" of m et n.\r
-    //i=n-floor(n./m).*m\r
-\r
-    [lhs, rhs] = argn(0);\r
-    if rhs <> 2 then\r
-        error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"), "pmodulo", 2));\r
-    end\r
-\r
-    if ~isreal(n) then\r
-        error(msprintf(gettext("%s: Wrong type for input argument #%d: A real expected.\n"), "pmodulo", 1));\r
-    end\r
-\r
-    if ~isreal(m) then\r
-        error(msprintf(gettext("%s: Wrong type for input argument #%d: A real expected.\n"), "pmodulo", 2));\r
-    end\r
-\r
-    if size(n,'*') == 1 then\r
-        i = zeros(m);\r
-        k = find(m == 0)\r
-        i(k) = n - floor(n ./ m(k)) .* m(k);\r
-        k = find(m~=0);\r
-        i(k) = n-floor(n./m(k)).*m(k);\r
-    elseif size(m,'*') == 1 then\r
-        i = zeros(n);\r
-        if m == 0 then\r
-            i = n - floor(n ./ m) .* m;\r
-        else\r
-            i = n-floor(n./m).*m;\r
-        end\r
-    else\r
-        if or(size(n)<>size(m)) then \r
-            error(msprintf(gettext("%s: Wrong size for input arguments: Same size expected.\n"),"pmodulo"));\r
-        end\r
-        i = zeros(n);\r
-        k = find(m==0);\r
-        i(k) = n(k) - floor(n(k) ./ m(k)) .* m(k);\r
-        k = find(m~=0);\r
-        i(k) = n(k)-floor(n(k)./m(k)).*m(k);\r
-    end\r
-endfunction\r
-\r
-\r
-\r
-\r
-\r\r
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) INRIA
+// Copyright (C) DIGITEO - 2011 - Allan CORNET
+// Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS
+// Copyright (C) 2013 - Samuel GOUGEON
+// 
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+function i = pmodulo(n, m)
+    //i=pmodulo(n,m) the "positive modulo" of m et n.
+    //i=n-floor(n./m).*m
+
+    [lhs, rhs] = argn(0);
+    if rhs <> 2 then
+        error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"), "pmodulo", 2));
+    end
+
+    if ~isreal(n) then
+        error(msprintf(gettext("%s: Wrong type for input argument #%d: A real expected.\n"), "pmodulo", 1));
+    end
+
+    if ~isreal(m) then
+        error(msprintf(gettext("%s: Wrong type for input argument #%d: A real expected.\n"), "pmodulo", 2));
+    end
+
+    m = abs(m)  // else returns i<0 for m<0 : http://bugzilla.scilab.org/12373
+    if size(n,'*') == 1 then
+        i = zeros(m);
+        k = find(m == 0)
+        i(k) = n - floor(n ./ m(k)) .* m(k);
+        k = find(m~=0);
+        i(k) = n-floor(n./m(k)).*m(k);
+    elseif size(m,'*') == 1 then
+        i = zeros(n);
+        if m == 0 then
+            i = n - floor(n ./ m) .* m;
+        else
+            i = n-floor(n./m).*m;
+        end
+    else
+        if or(size(n)<>size(m)) then 
+            error(msprintf(gettext("%s: Wrong size for input arguments: Same size expected.\n"),"pmodulo"));
+        end
+        i = zeros(n);
+        k = find(m==0);
+        i(k) = n(k) - floor(n(k) ./ m(k)) .* m(k);
+        k = find(m~=0);
+        i(k) = n(k)-floor(n(k)./m(k)).*m(k);
+    end
+endfunction