目前我正在使用 boost::rational<std::uint64>
跟踪我的申请。
基本上我有一个运行很长一段时间的时钟,并且会被不同时间分辨率的不同组件滴答作响,例如1/50s、1/30s、1001/30000s 等...我想保持完美的精度,即没有 float 。 boost::rational
为此目的效果很好,但我认为使用 std::chrono::duration
会更好。为此。
但我的问题是,如何使用 std::chrono::duration
这里?由于它使用编译时间段,我不太明白如何在我需要保持精度的场景中使用它?
最佳答案
如果我理解您的问题,并且如果您知道编译时的所有不同时间分辨率,那么以下内容将满足您的要求。您可以通过在所有不同的时间分辨率上使用 common_type
来找出正确的滴答周期,如下所示:
#include <cstdint>
#include <chrono>
struct clock
{
typedef std::uint64_t rep;
typedef std::common_type
<
std::chrono::duration<rep, std::ratio<1, 50>>,
std::chrono::duration<rep, std::ratio<1, 30>>,
std::chrono::duration<rep, std::ratio<1001, 30000>>
>::type duration;
typedef duration::period period;
typedef std::chrono::time_point<clock> time_point;
static const bool is_steady = true;
static time_point now()
{
// just as an example
using namespace std::chrono;
return time_point(duration_cast<duration>(steady_clock::now().time_since_epoch()));
}
};
这将在编译时计算最大的滴答周期,它将准确地代表您指定的每个分辨率。例如,这个时钟可以准确地表示:
- 1/50 600 个刻度。
- 1/30,1000 个刻度。
- 1001/30000,有 1001 个刻度。
下面的代码运行这个时钟
并使用描述的“chrono_io”工具here不仅打印出时钟的运行时滴答数,还打印出时钟滴答的编译时单位:
#include <iostream>
#include <thread>
#include "chrono_io"
int main()
{
auto t0 = clock::now();
std::this_thread::sleep_for(std::chrono::milliseconds(20));
auto t1 = clock::now();
std::cout << (t1-t0) << '\n';
}
对我来说,这是打印出来的:
633 [1/30000]seconds
含义:调用 now()
之间有 633 个时钟滴答,每个滴答的单位是 1/30000 秒。如果您不想受制于“chrono_io”,您可以使用 clock::period::num
和 clock::period::den
检查时钟的单位>.
如果您的不同时间分辨率不是编译时信息,那么您当前使用 boost::rational
的解决方案可能是最好的。
关于c++ - 不同时间段的计时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12787544/