2017-10-25 32 views
5

rational_cast<int64_t> yuvarlama ile nasıl yapabilirim?rational_cast'i yuvarlama ile artırın mı?

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

Ama kayan nokta içeren olmadan "düzgün" Bunu yapabilmek istiyorum:

Şu anda böyle bir hack yapıyorum.

+0

Wh ilgili türleri nelerdir? Spesifik olarak, 'pts' ve' time_base' – sehe

+0

@sehe: Onlar bo yükselticidir rasyonel ' – ronag

cevap

1

Yuvarlama doğal olarak zararlıdır.

basitçe yerleşik davranış yarıya ve ofset (floor -ing veya trunc sonuç -Ing olan) kullandığı akla gelen en hızlı kesmek:

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"; 
     } 
    } 
} 

Baskılar

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