Mercurial > hg > octave-lyh
diff liboctave/idx-vector.cc @ 2500:e39839e18edc
[project @ 1996-11-12 17:13:53 by jwe]
author | jwe |
---|---|
date | Tue, 12 Nov 1996 17:13:53 +0000 |
parents | 4fc9fd1424a9 |
children | f8d5dbbbc50a |
line wrap: on
line diff
--- a/liboctave/idx-vector.cc +++ b/liboctave/idx-vector.cc @@ -38,6 +38,7 @@ #include "idx-vector.h" #include "lo-error.h" +#include "lo-mappers.h" #define IDX_VEC_REP idx_vector::idx_vector_rep @@ -73,10 +74,26 @@ static inline int tree_to_mat_idx (double x) { - if (x > 0) - return ((int) (x + 0.5) - 1); - else - return ((int) (x - 0.5) - 1); + return (x > 0) ? ((int) (x + 0.5) - 1) : ((int) (x - 0.5) - 1); +} + +static inline bool +idx_is_inf_or_nan (double x) +{ + bool retval = false; + + if (xisnan (x)) + { + (*current_liboctave_error_handler) ("NaN invalid as index"); + retval = true; + } + else if (xisinf (x)) + { + (*current_liboctave_error_handler) ("Inf invalid as index"); + retval = true; + } + + return retval; } IDX_VEC_REP::idx_vector_rep (const ColumnVector& v) @@ -106,8 +123,16 @@ else { data = new int [len]; + for (int i = 0; i < len; i++) - data[i] = tree_to_mat_idx (v.elem (i)); + { + double d = v.elem (i); + + if (idx_is_inf_or_nan (d)) + return; + else + data[i] = tree_to_mat_idx (d); + } } init_state (); @@ -141,9 +166,17 @@ { int k = 0; data = new int [len]; + for (int j = 0; j < orig_nc; j++) for (int i = 0; i < orig_nr; i++) - data[k++] = tree_to_mat_idx (m.elem (i, j)); + { + double d = m.elem (i, j); + + if (idx_is_inf_or_nan (d)) + return; + else + data[k++] = tree_to_mat_idx (d); + } } init_state (); @@ -163,11 +196,14 @@ orig_nr = 1; orig_nc = 1; - data = new int [len]; + if (idx_is_inf_or_nan (d)) + return; + else + { + data = new int [len]; - data[0] = tree_to_mat_idx (d); - - init_state (); + data[0] = tree_to_mat_idx (d); + } } IDX_VEC_REP::idx_vector_rep (const Range& r) @@ -208,7 +244,11 @@ for (int i = 0; i < len; i++) { double val = b + i * step; - data[i] = tree_to_mat_idx (val); + + if (idx_is_inf_or_nan (val)) + return; + else + data[i] = tree_to_mat_idx (val); } init_state ();