<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
--></style>
</head>
<body class='hmmessage'>
I've gone ahead and "rewritten" this code (it's only a few lines), and I removed this distinction.<br>New form uses modf to split floating point at the decimal point and then multiplies the fractional part by a million (struct timeval) or a billion (struct timespec). Should be equivalent to<br>seconds = (int)floatseconds;<br>microsseconds = (floatseconds - seconds) * billion or million<br>or such<br>I ended up not using the C99 stuff.<br><br>Sometimes we know the time is less than a second and greater than 0 and so just pass around a microsecond or nanosecond count.<br><br>Hm. Maybe it has to do with negative times? Rounding down vs. toward zero?<br>I'll probably rereread the code with negative times in mind.<br>Not too worried, as the select uses in the thread code doesn't pass negative times, gettimeofday can't return a negative time, the user thread scheduling intervals I believe are all positive, etc.<br><br><br> - Jay<br><br><hr id="stopSpelling">From: jay.krell@cornell.edu<br>To: m3devel@elegosoft.com<br>Subject: ROUND vs. FLOOR in ThreadPThread.m3 nano vs. micro time conversions?<br>Date: Fri, 9 Apr 2010 10:52:09 +0000<br><br>



<style>
.ExternalClass .ecxhmmessage P
{padding:0px;}
.ExternalClass body.ecxhmmessage
{font-size:10pt;font-family:Verdana;}
</style>


Why does UTimeFromTime use FLOOR but ToNTime uses ROUND?<br>
 <br>
<br>PROCEDURE ToNTime (n: LONGREAL; VAR ts: Utime.struct_timespec) =<br>  BEGIN<br>    ts.tv_sec := TRUNC(n);<br>    ts.tv_nsec := ROUND((n - FLOAT(ts.tv_sec, LONGREAL)) * 1.0D9);<br>  END ToNTime;<br>
 <br>
<br>TYPE UTime = Utime.struct_timeval;<br>
PROCEDURE UTimeFromTime (time: Time.T): UTime =<br>  VAR floor := FLOOR(time);<br>  BEGIN<br>    RETURN UTime{floor, FLOOR(1.0D6 * (time - FLOAT(floor, LONGREAL)))};<br>  END UTimeFromTime;<br>
 <br>
<br>I've changed this code to pass doubles to C and do the conversion<br>there. To reduce/eliminate use of cloned headers.<br>
 <br>
<br>For ROUND I'm using C99:<br>
<br>/* C99, very portable */<br>     long  lround(double);<br>long long llround(double);<br>
<br>#ifdef __CYGWIN__<br>#define ROUND lround<br>#else<br>#define ROUND llround<br>#endif<br>typedef double FloatSeconds, LONGREAL;<br>typedef struct timeval MicrosecondsStruct_t;<br>
#define FLOAT(value, type) ((type)value)<br>#define FLOOR floor<br>
 <br>
 <br>
static<br>MicrosecondsStruct_t*<br>FloatSecondsToNanosecondsStruct(LONGREAL n,<br>                                MicrosecondsStruct_t* ts)<br>{<br>    ts->tv_sec = (time_t)n;<br>    ts->tv_nsec = ROUND((n - FLOAT(ts->tv_sec, LONGREAL)) * 1.0E9);<br>    return ts;<br>}<br>
 <br>
 <br>
static<br>MicrosecondsStruct_t*<br>FloatSecondsToMicrosecondsStruct(FloatSeconds timeout,<br>                                 MicrosecondsStruct_t* utime)<br>{<br>    LONGINT sec = FLOOR(timeout);<br>    utime->tv_sec = (time_t)sec;<br>    utime->tv_usec = (suseconds_t)FLOOR(1.0E6 * (timeout - FLOAT(sec, LONGREAL)));<br>    return utime;<br>}<br>
 <br>
 <br>
Just arbitrarily a little more correct in the nano case vs. the micro case?<br>
Matters little? Would matter more for micro due to lower resolution?<br>
 <br>
 <br>
Thanks,<br> - Jay<br><br><br><br><br>                                    </body>
</html>