Есть ли эквивалент дроби Python.Fraction (bignum / дробь произвольной точности / класс рациональных чисел)?

Я хотел бы сделать некоторые математические вычисления произвольной точности на рациональных числах, например:

>>> from fractions import Fraction
>>> Fraction(318483434, 1980410394309430943904903) * Fraction(34913483843843843843, 902490524905498548954894898889923232)
Fraction(5559683113745453573439198431, 893650808144311844544465740142994088494601632782777989203248)

Есть ли библиотека, которая позволила бы мне сделать это простым способом?

2

Решение

Если вы используете повышение, вы можете использовать boost::rational в сочетании с boost::multiprecision::cpp_int (целое число произвольной точности):

#include <boost/rational.hpp>
#include <boost/multiprecision/cpp_int.hpp>

using boost::multiprecision::cpp_int;

typedef boost::rational<cpp_int> fraction_t;

По какой-то причине конструктор fraction_t("1", "2") не работает, хотя cpp_int("1") делает, так что если вам нужны большие литералы int, вы можете использовать эту вспомогательную функцию, чтобы не требовать явного построения cpp_int объекты каждый раз, когда вы создаете дробь:

template <typename A, typename B>
fraction_t fraction(A a, B b)
{
return fraction_t(cpp_int(a), cpp_int(b));
}

использование:

cout << fraction(318483434, "1980410394309430943904903") *
fraction("34913483843843843843", "902490524905498548954894898889923232") << endl;

Выход:

5559683113745453573439198431/893650808144311844544465740142994088494601632782777989203248
2

Другие решения