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;