Mam struct reprezentujący nieujemną liczbą wymierną P/Q:Mnożąc liczbę całkowitą przez racjonalne bez pośredniego przelewem
struct rational {
uint64_t p;
uint64_t q; // invariant: always > 0
};
chciałbym mnożyć mój racjonalny przez uint64 n
i uzyskać wynik całkowitą, zaokrąglony dół. Oznacza to, że jak to obliczenie:
uint64_t m = (n * r.p)/r.q;
unikając pośredniego przepełnienie n * r.p
. (Oczywiście końcowy wynik może być przepełniony, co jest dopuszczalne.)
Jak mogę to zrobić? Czy istnieje sposób, aby to zrobić bez wysokiego mnożenia?
(I spojrzał na boost :: racjonalne, ale nie wydaje się, aby zapewnić tę funkcję).
nie będzie pracować z 'uint64_t m = (n/r.q) * r.p'? – dangom
Oblicz liczbę wymierną 'n/r.q' i zmniejsz ją do najniższej formy, a następnie pomnóż ją przez' r.p'. – Barmar
@DanielG, Barmar: Żadna z tych opcji nie pomaga, jeśli 'p == n' i' p