added residual computation; improved handling of bad input