通过舍入提高rational_cast



如何进行四舍五入rational_cast<int64_t>

目前我正在做这样的黑客:

boost::rational<int64_t> pts = ..., time_base = ...;
int64_t rounded = std::llround(boost::rational_cast<long double>(pts / time_base)); 

但我希望能够在不涉及浮点的情况下"正确"做到这一点。

舍入本质上是有损的。

想到的最快的技巧是简单地使用内置行为(floor -ing 或 trunc -ing 结果)并偏移一半:

住在科里鲁

#include <iostream>
#include <fstream>
#include <boost/rational.hpp>
int main() {
    using R = boost::rational<int64_t>;
    for (auto den : {5,6}) {
        std::cout << "---------n";
        for (auto num : {1,2,3,4,5,6}) {
            R pq(num, den);
            std::cout << num << "/" << den << " = " << pq << ": " 
                      << boost::rational_cast<int64_t>(pq + R(1,2)) << "n";
        }
    }
}

指纹

---------
1/5 = 1/5: 0
2/5 = 2/5: 0
3/5 = 3/5: 1
4/5 = 4/5: 1
5/5 = 1/1: 1
6/5 = 6/5: 1
---------
1/6 = 1/6: 0
2/6 = 1/3: 0
3/6 = 1/2: 1
4/6 = 2/3: 1
5/6 = 5/6: 1
6/6 = 1/1: 1

最新更新