changeset 25236:69b21b8a0e9f

nextpow2.m: Compute value correctly for Inf or NaN inputs (bug #53463). * nextpow2.m: Change docstring to define the output variable N. Check for failure of 2-input form of log2 function by looking for an exponent of 0. If found, copy over the value that log2 was not able to process (e.g., Inf or NaN). Add BIST tests for special cases. Add fail pattern to %!error test.
author Rik <rik@octave.org>
date Thu, 12 Apr 2018 14:34:10 -0700
parents 27e6b38571d3
children ca022a8c4015
files scripts/general/nextpow2.m
diffstat 1 files changed, 13 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/general/nextpow2.m	Fri Mar 23 19:03:45 2018 -0400
+++ b/scripts/general/nextpow2.m	Thu Apr 12 14:34:10 2018 -0700
@@ -17,7 +17,7 @@
 ## <https://www.gnu.org/licenses/>.
 
 ## -*- texinfo -*-
-## @deftypefn {} {} nextpow2 (@var{x})
+## @deftypefn {} {@var{n} =} nextpow2 (@var{x})
 ## Compute the exponent for the smallest power of two larger than the input.
 ##
 ## For each element in the input array @var{x}, return the first integer
@@ -47,7 +47,9 @@
   endif
 
   [f, n] = log2 (abs (x));
-  n(f == 0.5)--;
+  idx = (n == 0);   # Find any failures of log2 function (n == 0)
+  n(idx) = f(idx);  # and copy over value.
+  n(f == 0.5)--; 
 
 endfunction
 
@@ -59,6 +61,15 @@
 %!assert (nextpow2 (-17), 5)
 %!assert (nextpow2 (-31), 5)
 %!assert (nextpow2 (1:17), [0 1 2 2 3 3 3 3 4 4 4 4 4 4 4 4 5])
+## Special cases
+%!assert (nextpow2 (0), 0)
+%!assert (nextpow2 (1), 0)
+%!assert (nextpow2 (Inf), Inf)
+%!assert (nextpow2 (-Inf), Inf)
+%!assert (nextpow2 (NaN), NaN)
+%!assert (nextpow2 ([1, Inf, 3, -Inf, 9, NaN]), [0, Inf, 2, Inf, 4, NaN])
 
+## Test input validation
 %!error nexpow2 ()
 %!error nexpow2 (1, 2)
+%!error <X must be numeric> nextpow2 ("t")