1

現在boost::rational<std::uint64>、アプリケーションを追跡するために使用しています。

基本的に、私は非常に長い時間にわたって動作する時計を持っており、さまざまな時間分解能のさまざまなコンポーネント、たとえば1 / 50、1 / 30、1001 / 30000などによって刻みます...完璧な精度を維持したい、つまり浮動小数点はありません。boost::rationalこの目的にはうまく機能しますがstd::chrono::duration、これに使用する方が良い設計だと思います。

std::chrono::duration私の問題は、ここでどのように使用できるかということです。コンパイル期間を使用しているため、精度を維持する必要があるシナリオでどのように使用できるかわかりません。

4

2 に答える 2

4

私があなたの質問を理解している場合、およびコンパイル時のさまざまな時間解像度をすべて知っている場合は、次のように実行できます。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()));
    }
};

これにより、コンパイル時に、指定した各解像度を正確に表す最大のティック期間が計算されます。たとえば、この時計では次のことを正確に表すことができます。

  • 600 ティックで 1/50。
  • 1000 ティックで 1/30。
  • 1001 ティックで 1001/30000。

以下のコードはこれを実行し、ここでclock説明されている「chrono_io」機能を使用して、クロックの実行時のティック数だけでなく、クロックティックのコンパイル時の単位も出力します。

#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

意味: への呼び出しの間に 633 クロック ティックがありnow()、各ティックの単位は 1/30000 秒です。「chrono_io」に縛られたくない場合は、 と を使用して時計の単位を調べることができclock::period::numますclock::period::den

異なる時間解像度がコンパイル時の情報でない場合は、現在のソリューションboost::rationalがおそらく最適です。

于 2012-11-17T23:12:55.930 に答える
1

にピリオドを設定し1、浮動小数点型を使用することができますRep

同じことができると思いboost::rationalますが、私が行っていない を詳しく調べる必要がありますstd::chrono。と を見てtreat_as_floating_pointくださいduration_values。また、「算術型または算術型をエミュレートするクラス」によって標準が何を意味するのかを理解してみてください。

boost::rationalが算術型をエミュレートしない場合、それはその仕事をしていないと合理的に主張するかもしれません。しかし、それが実際にすべてが期待どおりに機能するとは限りません。std::chrono::duration

于 2012-10-08T18:52:31.953 に答える