повысить рациональный_каст с округлением?

Как я могу сделать rational_cast<int64_t> с округлением?

В настоящее время я делаю хак, как это:

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

Но я хотел бы быть в состоянии сделать это «правильно», не используя с плавающей запятой.

5

Решение

Округление по своей природе с потерями.

Самый быстрый взлом, который приходит на ум, это просто использование встроенного поведения (которое floorили trunc-счет результата) и смещение на половину:

Жить на Колиру

#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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]