<div dir="ltr"><div><span style="font-size:12.6667px">> I’m afraid I don’t qualify for the bonus, because I don’t know what </span><span class="m_4856135312358455394SpellE" style="font-size:12.6667px">LargerFloat</span><span style="font-size:12.6667px"> is.</span><br></div><div><br></div><div>I am a little bit embarrassed here. The TLargerFloat is a type I wrote for a simple test some time ago and I forgot about it. I was following the TLargeInteger convention (from struct.inc in my current windows system):</div><div><br></div><div>After realizing that the Extended type was not made for cross-platform, my point with TLargerFloat was to have a central place to test some types. I decided to use Double for everything, following the equivalence with pythonic doubles for timestamp synchronization in the systems I use.</div><div><br></div><div>unit timestamps.types;<br><br>{$mode ObjFPC}{$H+}<br><br>interface<br><br>type<br>  {$IFDEF CPU86}{$IFDEF CPU32}<br>    TLargerFloat = Extended;<br>  {$ENDIF}{$ENDIF}<br><br>  {$IFDEF CPUX86_64}<br>    TLargerFloat = Double;<br>  {$ENDIF}<br><br>implementation<br><br>end.<br></div><div><br></div><div>___</div><div><br></div><div>So, I guess I finally found why precision was better for explicitly typecasts in Linux (despite the higher granularity of clock_monotonic):</div><div><br></div><div>I guess {$MINFPCONSTPREC 64}  would avoid explicit typecasting in the following code, is it correct?<br></div><div><br></div><div>unit timestamps;<br><br>{$mode objfpc}{$H+}<br><br>// {$MINFPCONSTPREC 64}<br><br>interface<br><br>uses<br>  SysUtils, timestamps.types<br><br>{$IFDEF LINUX}<br>  , Linux<br>  , UnixType<br>{$ENDIF}<br><br>{$IFDEF DARWIN}<br>  , ctypes<br>  , MachTime<br>{$ENDIF}<br><br>{$IFDEF WINDOWS}<br>  , Windows<br>{$ENDIF}<br>  ;<br><br>function ClockMonotonic : TLargerFloat;<br><br>implementation<br><br>{$IFDEF LINUX}<br>function ClockMonotonic: TLargerFloat;<br>var<br>  tp: timespec;<br>  a, b : TLargerFloat;<br>begin<br>  clock_gettime(CLOCK_MONOTONIC, @tp);<br>  a := TLargerFloat(tp.tv_sec);<br>  b := TLargerFloat(tp.tv_nsec) * 1e-9;<br>  Result := a+b;<br>end;<br>{$ENDIF}<br><br>{$IFDEF DARWIN}<br>{credits: <a href="https://github.com/pupil-labs/pyuvc/blob/master/pyuvc-source/darwin_time.pxi">https://github.com/pupil-labs/pyuvc/blob/master/pyuvc-source/darwin_time.pxi</a>}<br><br>var<br>  timeConvert: TLargerFloat = 0.0;<br><br>function ClockMonotonic : TLargerFloat;<br>var<br>  timeBase: mach_timebase_info_data_t;<br>begin<br>  if timeConvert = 0.0 then begin<br>    mach_timebase_info(@timeBase);<br>    timeConvert :=<br>      (TLargerFloat(timeBase.numer) / TLargerFloat(timeBase.denom) / TLargerFloat(1000000000.0);<br>  end;<br>  Result := mach_absolute_time() * timeConvert;<br>end;<br>{$ENDIF}<br><br>{$IFDEF WINDOWS}<br>var<br>  PerSecond : TLargeInteger;<br><br>function ClockMonotonic: TLargerFloat;<br>var<br>  Count : TLargeInteger;<br>begin<br>  QueryPerformanceCounter(Count);<br>  Result := TLargerFloat(Count) / TLargerFloat(PerSecond);<br>end;</div><div><br>initialization<br>   QueryPerformanceFrequency(PerSecond);<br>{$ENDIF}<br><br>end. </div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Feb 6, 2024 at 12:52 PM James Richters <<a href="mailto:james.richters@productionautomation.net">james.richters@productionautomation.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="msg4856135312358455394"><div lang="EN-US" style="overflow-wrap: break-word;"><div class="m_4856135312358455394WordSection1"><div><div><p class="MsoNormal">This is my opinion from my testing, but others may have something else to say.<u></u><u></u></p><p class="MsoNormal"><span><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:9.5pt">1) Does it affects constants only? <u></u><u></u></span></p><p class="MsoNormal">Not really, if you set a variable with constant terms, it is affected, if you set a variable with other variables, it is not affected.<u></u><u></u></p><p class="MsoNormal"><span class="m_4856135312358455394SpellE">Cont</span><u></u><u></u></p><p class="MsoNormal"><span>   </span><span class="m_4856135312358455394SpellE">Mycontant</span> := 8432+33/1440.0; <span>   </span>//Is affected;<u></u><u></u></p><p class="MsoNormal">Var<u></u><u></u></p><p class="MsoNormal"><span>   </span><span class="m_4856135312358455394SpellE">MyDoubleVariable:Double</span>;<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal"><span class="m_4856135312358455394SpellE">MyDoubleVariable</span> := 8432+33/1440.0;<span>   </span>//Is affected<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Var<u></u><u></u></p><p class="MsoNormal"><span>   </span><span class="m_4856135312358455394SpellE">MyInteger</span> : <span class="m_4856135312358455394SpellE">Ineger</span>;<u></u><u></u></p><p class="MsoNormal"><span>   </span><span class="m_4856135312358455394SpellE">MyByte</span> :<span>  </span>Byte<u></u><u></u></p><p class="MsoNormal"><span>   </span><span class="m_4856135312358455394SpellE">MySingle</span> : Single;<u></u><u></u></p><p class="MsoNormal"><span>   </span><span class="m_4856135312358455394SpellE">MyDouble</span> : Double;<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal"><span class="m_4856135312358455394SpellE">MyInteger</span> := 8432;<u></u><u></u></p><p class="MsoNormal"><span class="m_4856135312358455394SpellE">MyByte</span> := 33;<u></u><u></u></p><p class="MsoNormal"><span class="m_4856135312358455394SpellE">MySingle</span> := 1440.0;<u></u><u></u></p><p class="MsoNormal"><span class="m_4856135312358455394SpellE">MyDouble</span> := <span class="m_4856135312358455394SpellE">MyInteger</span> + <span class="m_4856135312358455394SpellE">MyByte</span> / <span class="m_4856135312358455394SpellE">MySingle</span>; //<span>  </span><span> </span>is NOT affected;<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal"><span><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:9.5pt">2) Does it affects the <span class="m_4856135312358455394SpellE">LargerFloat</span> type?<span>  </span><u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:9.5pt">I don’t know what you mean by <span class="m_4856135312358455394SpellE">LargerFloat</span>, but Double an d Extended are affected, and even Real if your platform defines Real as a Double.<u></u><u></u></span></p><p class="MsoNormal"><span>Anything that is not Single precision is affected.<u></u><u></u></span></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal"><span style="font-size:9.5pt">3) Should I use {$MINFPCONSTPREC 64} in {$mode <span class="m_4856135312358455394SpellE">objfpc</span>} too to avoid it?<span>   </span></span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt">Everyone should use {$MINFPCONSTPREC 64} in all programs until the bug is fixed, unless you use extended, then you have no good solution. Because you can’t set it to 80.<br><u></u><br><u></u></span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt">4) BONUS: Is the <span class="m_4856135312358455394SpellE">LargerFloat</span> type really the larger, or should one do something else?<span>  </span></span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt">I’m afraid I don’t qualify for the bonus, because I don’t know what <span class="m_4856135312358455394SpellE">LargerFloat</span> is.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:9.5pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:9.5pt">James</span><u></u><u></u></p><p class="MsoNormal"><span><u></u> <u></u></span></p><p class="MsoNormal"><span><u></u> <u></u></span></p><p class="MsoNormal"><span><u></u> <u></u></span></p></div></div></div></div></div></blockquote></div></div>