changeset 22864:d744b1ed4851

avoid conversion warnings in time -> double functions * oct-time.h (as_double): New function. (time::double_value, cpu_time::user, cpu_time::system): Use it.
author John W. Eaton <jwe@octave.org>
date Mon, 05 Dec 2016 21:04:07 -0500
parents f28e1f5d33a4
children 89756f2f085b
files liboctave/system/oct-time.h
diffstat 1 files changed, 18 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/system/oct-time.h	Mon Dec 05 18:09:08 2016 -0500
+++ b/liboctave/system/oct-time.h	Mon Dec 05 21:04:07 2016 -0500
@@ -28,6 +28,16 @@
 #include <ctime>
 #include <string>
 
+static inline double
+as_double (time_t sec, long usec)
+{
+  // Unix time will be exactly representable as a double for more than
+  // 100 million years, so no worry there, and microseconds has a
+  // range of 0-1e6, so we are safe there as well.
+
+  return (static_cast<double> (sec) + static_cast<double> (usec) / 1.0e6);
+}
+
 namespace octave
 {
   namespace sys
@@ -46,10 +56,10 @@
       time (time_t t)
         : ot_unix_time (t), ot_usec (0) { }
 
-      time (time_t t, int us)
+      time (time_t t, long us)
         : ot_unix_time (t), ot_usec ()
       {
-        int rem, extra;
+        long rem, extra;
 
         if (us >= 0)
           {
@@ -90,7 +100,10 @@
 
       void stamp (void);
 
-      double double_value (void) const { return ot_unix_time + ot_usec / 1e6; }
+      double double_value (void) const
+      {
+        return as_double (ot_unix_time, ot_usec);
+      }
 
       time_t unix_time (void) const { return ot_unix_time; }
 
@@ -400,14 +413,12 @@
 
       double user (void) const
       {
-        return (static_cast<double> (m_usr_sec)
-                + static_cast<double> (m_sys_usec) * 1e-6);
+        return as_double (m_usr_sec, m_usr_usec);
       }
 
       double system (void) const
       {
-        return (static_cast<double> (m_sys_sec)
-                + static_cast<double> (m_sys_usec) * 1e-6);
+        return as_double (m_sys_sec, m_sys_usec);
       }
 
       time_t user_sec (void) const { return m_usr_sec; }