/* Returns the boundaries of a Dvector, that is [min, max]. It ignores NaN and will complain if the Dvector contains only NaN. v = Dvector[0.0/0.0, 0.0/0.0, 1,2,4,5,9,0.0/0.0,0.1] v.bounds -> [0.1, 9] */ static VALUE dvector_bounds(VALUE self) { double min, max; VALUE ret; long len; double * data = Dvector_Data_for_Read(self, &len); /* skip all NaNs at the beginning */ while(len-- > 0) if(!isnan(*data++)) break; if(len>=0) { min = max = *(data-1); while(len-- > 0) { if(! isnan(*data)) { if(*data < min) min = *data; if(*data > max) max = *data; } data++; } ret = rb_ary_new2(2); rb_ary_store(ret, 0, rb_float_new(min)); rb_ary_store(ret, 1, rb_float_new(max)); return ret; } else rb_raise(rb_eRuntimeError, "bounds called on an array containing only NaN"); return Qnil; }