Tôi có một cấu trúc đại diện cho một âm hợp lý số p/q:Nhân số nguyên do hợp lý mà không tràn trung
struct rational {
uint64_t p;
uint64_t q; // invariant: always > 0
};
Tôi muốn nhân hợp lý của tôi bằng một uint64 n
và nhận được một kết quả số nguyên, làm tròn xuống. Tức là, tôi muốn tính toán:
uint64_t m = (n * r.p)/r.q;
trong khi tránh tràn trung gian trong n * r.p
. (Tất nhiên kết quả cuối cùng có thể tràn, có thể chấp nhận được.)
Làm cách nào để thực hiện việc này? Có cách nào để làm điều đó mà không cần nhân lên cao không?
(Tôi nhìn boost :: hợp lý nhưng nó không xuất hiện để cung cấp tính năng này.)
nó sẽ không làm việc với 'uint64_t m = (n/r.q) * r.p'? – dangom
Tính số hợp lý 'n/r.q' và giảm số đó thành dạng thấp nhất, sau đó nhân số đó với' r.p'. – Barmar
@DanielG, Barmar: Không có sự trợ giúp nào nếu 'p == n' và' p