読者です 読者をやめる 読者になる 読者になる

Boost.Chrono durationの丸め演算

C++

Boost.Chronoには、duration間の型変換において丸めが発生する場合に明示的に切り捨てを行うためのduration_cast()という関数が用意されていました。
Boost 1.48.0から、従来のduration_cast()に加えて、切り捨てを行うfloor()、最近接偶数への丸めを行うround()(※四捨五入ではない)、切り上げを行うceil()という、3つの関数が追加されました。

#include <iostream>
#include <boost/chrono/duration.hpp>
#include <boost/chrono/chrono_io.hpp>
#include <boost/chrono/floor.hpp>
#include <boost/chrono/round.hpp>
#include <boost/chrono/ceil.hpp>

namespace chrono = boost::chrono;

int main ()
{
    chrono::milliseconds ms(2500);

    {
        chrono::seconds s = chrono::duration_cast<chrono::seconds>(ms);
        std::cout << "duration_cast : " << s << std::endl;
    }
    {
        chrono::seconds s = chrono::floor<chrono::seconds>(ms);
        std::cout << "floor : " << s << std::endl;
    }
    {
        chrono::seconds s = chrono::round<chrono::seconds>(ms);
        std::cout << "round : " << s << std::endl;
    }
    {
        chrono::seconds s = chrono::ceil<chrono::seconds>(ms);
        std::cout << "ceil : " << s << std::endl;
    }
}
duration_cast : 2 seconds
floor : 2 seconds
round : 2 seconds
ceil : 3 seconds

リファレンス:
Chrono Rounding Utilities - Boost Chrono Library


この機能の元となったHorward Hinnantの提案は以下:
<chrono> utilities