# HG changeset patch # User Ben Abbott # Date 1204684452 18000 # Node ID 4f4f020bcf7cd28b56b32cfb0eae83dbb9c314f6 # Parent 6070c3bd69c44a75b8c5a0f72056df36cf348564 roots.m: Catch Infs and NaNs. diff -r 6070c3bd69c4 -r 4f4f020bcf7c scripts/ChangeLog --- a/scripts/ChangeLog Tue Mar 04 17:01:05 2008 -0500 +++ b/scripts/ChangeLog Tue Mar 04 21:34:12 2008 -0500 @@ -1,3 +1,7 @@ 2008-03-04 Bill Denney + + * polynomial/roots.m: Modified to catch Infs and/or NaNs. + 2008-03-04 Bill Denney * geometry/rectint.m: New function. diff -r 6070c3bd69c4 -r 4f4f020bcf7c scripts/polynomial/roots.m --- a/scripts/polynomial/roots.m Tue Mar 04 17:01:05 2008 -0500 +++ b/scripts/polynomial/roots.m Tue Mar 04 21:34:12 2008 -0500 @@ -83,16 +83,18 @@ function r = roots (v) if (nargin != 1 || min (size (v)) > 1) print_usage (); + elseif (any (isnan(v) | isinf(v))) + error ("roots: inputs must not contain Inf or NaN.") endif - n = length (v); - v = reshape (v, 1, n); + n = numel (v); + v = v(:); ## If v = [ 0 ... 0 v(k+1) ... v(k+l) 0 ... 0 ], we can remove the ## leading k zeros and n - k - l roots of the polynomial are zero. f = find (v); - m = max (size (f)); + m = numel (f); if (m > 0 && n > 1) v = v(f(1):f(m)); @@ -114,9 +116,20 @@ function r = roots (v) endfunction +%!test +%! p = [poly([3 3 3 3]), 0 0 0 0]; +%! r = sort (roots (p)); +%! assert (r, [0; 0; 0; 0; 3; 3; 3; 3], 0.001) + %!assert(all (all (abs (roots ([1, -6, 11, -6]) - [3; 2; 1]) < sqrt (eps)))); %!assert(isempty (roots ([]))); +%!assert(isempty (roots (1))); + %!error roots ([1, 2; 3, 4]); +%!error roots ([1 Inf 1]); + +%!error roots ([1 NaN 1]); +