是否有相当于Python的分数。分数(bignum /任意精度分数/有理数分类)?

时间:2015-06-25 15:18:11

标签: c++ math fractions bignum arbitrary-precision

我想对有理数进行一些任意精度的数学运算,例如:

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

是否有一个图书馆可以让我以直截了当的方式做到这一点?

1 个答案:

答案 0 :(得分:2)

如果您正在使用提升,则可以将boost::rationalboost::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文字,你可以使用这个辅助函数来不需要显式构造{每次创建分数时都会出现{1}}个对象:

cpp_int

Usage

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;