Strange result: std :: chrono :: duration_cast in 1 second and 2 seconds

I run a simple program where I take time_pointc system_clock::now, then this_thread::sleep_for(seconds(1))a time_pointc again system_clock::now.

Now, if I add an extra durationin the 1st time_point, it will give exactly the same result for 1 and 2 seconds!

Here is the daemon code :

#include<iostream>
#include<chrono>
#include<thread>
using namespace std;

void CheckDuration (std::chrono::duration<int> seconds)
{
  auto start = std::chrono::system_clock::now() + seconds;
  std::this_thread::sleep_for(std::chrono::seconds(1));
  auto stop = std::chrono::system_clock::now();

  cout << "Difference = " << std::chrono::duration_cast<std::chrono::seconds>(stop-start).count() << endl;
}

int main ()
{
  CheckDuration(std::chrono::duration<int>(0));  // Difference = 1
  CheckDuration(std::chrono::duration<int>(1));  // Difference = 0 
  CheckDuration(std::chrono::duration<int>(2));  // Difference = 0  <=== ???
  CheckDuration(std::chrono::duration<int>(3));  // Difference = -1
}
+4
source share
1 answer

It clarifies adding output with finer units, for example:

cout << "Difference = " << std::chrono::duration_cast<std::chrono::milliseconds>(stop-start).count() << endl;

For me, in the third case (argument 2 seconds), the output is:

Difference = -998

(i.e. in milliseconds)

, T0 now(), CheckDuration. :

start == T0 + 2s

stop T0, 1 , , epsilon. :

stop == T0 + 1s + epsilon

, :

T0 + 1s + epsilon - (T0 + 2s)

:

epsilon - 1s

, epsilon == 2ms

duration_cast , . -998ms 0s. , , .:

http://howardhinnant.imtqy.com/duration_io/chrono_util.html

+6

Source: https://habr.com/ru/post/1569155/


All Articles