2017-10-25 29 views
5

Tôi làm cách nào để thực hiện rational_cast<int64_t> với làm tròn?tăng rational_cast với làm tròn?

Hiện nay tôi đang làm một hack như thế này:

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

Nhưng tôi muốn để có thể làm điều đó "đúng" mà không liên quan đến dấu chấm động.

+0

Wh tại các loại có liên quan? Cụ thể, 'pts' và' time_base' – sehe

+0

@sehe: Chúng là 'boost :: hợp lý ' – ronag

Trả lời

1

Làm tròn vốn đã mất dần.

Các hack nhanh nhất mà đến với tâm chỉ đơn giản là sử dụng được xây dựng trong hành vi (đó là floor -ing hoặc trunc -ing kết quả) và bù đắp bằng một nửa:

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

Prints

--------- 
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 
Các vấn đề liên quan