2017-10-25 14 views
5

반올림하여 rational_cast<int64_t>을 어떻게 처리합니까?반올림하여 rational_cast를 향상 하시겠습니까?

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

하지만 부동 소수점을 포함하지 않고 "제대로"그것을 할 수 있도록하고 싶습니다 :

현재 나는이 같은 해킹을하고 있어요.

+0

ㅁ 관련된 유형이 있습니까? 구체적으로,'pts'와'time_base'가 있습니다. – sehe

+0

@sehe : 그들은'boost :: rational '입니다. – ronag

답변

1

반올림 자체는 손실이 있습니다.

단순히 내장 된 동작을 반으로 오프셋 (floor -ing 또는 trunc 결과를 -ing 인) 사용 마음에 오는 가장 빠른 해킹 :

Live On Coliru

#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