Mercurial > octave
changeset 24026:1cb94f46466f
Return Inf/-Inf when reading large numbers from files for Matlab compatibility.
* lo-utils.cc (octave_read_fp_value): If failbit is set on stream, check
whether value read was MAX_VAL and convert to Inf if found. Reset failbit on
stream in this case.
author | Rik <rik@octave.org> |
---|---|
date | Fri, 08 Sep 2017 13:26:59 -0700 |
parents | 1187ad4865fc |
children | fbdefffeaa21 |
files | liboctave/util/lo-utils.cc |
diffstat | 1 files changed, 16 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/liboctave/util/lo-utils.cc Fri Sep 08 12:36:22 2017 -0700 +++ b/liboctave/util/lo-utils.cc Fri Sep 08 13:26:59 2017 -0700 @@ -307,9 +307,22 @@ std::ios::iostate status = is.rdstate (); if (status & std::ios::failbit) { - is.clear (); - is.seekg (pos); - is.setstate (status); + // Convert MAX_VAL returned by C++ streams for very large numbers to Inf + if (val == std::numeric_limits<T>::max ()) + { + if (neg) + val = -std::numeric_limits<T>::infinity (); + else + val = std::numeric_limits<T>::infinity (); + is.clear (status & ~std::ios::failbit); + } + else + { + // True error. Reset stream to original position and pass status on. + is.clear (); + is.seekg (pos); + is.setstate (status); + } } return val;