* Bug 16522 fixed: bitget(x,pos) and bitset(..) with pos as encoded integer 45/21545/5
Samuel GOUGEON [Thu, 23 Jul 2020 01:37:54 +0000 (03:37 +0200)]
  http://bugzilla.scilab.org/16522

Change-Id: I93039b4399ff215c081e8a2c59b1996c696df850

scilab/CHANGES.md
scilab/modules/elementary_functions/macros/bitget.sci
scilab/modules/elementary_functions/macros/bitset.sci
scilab/modules/elementary_functions/tests/nonreg_tests/bug_16522.tst [new file with mode: 0644]

index f0baeeb..6897dea 100644 (file)
@@ -313,6 +313,7 @@ Bug Fixes
 * [#16458](https://bugzilla.scilab.org/16458): `mean()` did not handle sparse numerical matrices.
 * [#16465](https://bugzilla.scilab.org/16465): Scinotes OpenRecent menu was not updated when it should.
 * [#16473](https://bugzilla.scilab.org/16473): Deleting rows in a sparse squared the matrix with padding zeros (Scilab 6 regression).
+* [#16522](https://bugzilla.scilab.org/16522): `bitget(x,pos)` and `bitset(x,pos)` results could be wrong when `pos` is an encoded integer.
 
 
 ### Bugs fixed in 6.1.0:
index 79a5ce2..d4e88d0 100644 (file)
@@ -97,6 +97,7 @@ function z = bitget(x, pos)
             mask = 2 .^ iconvert(pos-1, inttype(x));
             z = iconvert(1 * ((x & mask) > 0),inttype(x));
         else
+            pos = double(pos)
             tmp = x ./ (2 .^ pos);
             z = bool2s((tmp - fix(tmp)) >= 0.5);
             below_eps = pos <= (log2(x)-52);
index b47408c..615554d 100644 (file)
@@ -58,7 +58,9 @@ function y = bitset(x, pos, v)
             error(msprintf(msg, fname, 2, posmax))
         end
     end
-    // Check consistency between x and pos sizes
+    pos = double(pos)
+
+   // Check consistency between x and pos sizes
     sx = size(x)
     ndx = ndims(x)
     sp = size(pos)
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_16522.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_16522.tst
new file mode 100644 (file)
index 0000000..cd60f91
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 16522 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16522
+//
+// <-- Short Description -->
+// bitget(x,pos) and bitset(x,pos) results could be wrong when pos is an
+// encoded integer.
+// Ex: bitget(2^(n*8-1), uint8(n*8)) with n in [1 2 4 8] returned 0 instead of 1
+
+for cast = list(int8, int16, int32, int64, uint8, uint16, uint32, uint64)
+    assert_checkequal(bitget(255,  cast(8)), 1);
+    assert_checkequal(bitget(2^15, cast(16)), 1);
+    assert_checkequal(bitset(0,  cast(8)), 2^7);
+    assert_checkequal(bitset(0, cast(16)), 2^15);
+end