【问题标题】:Is there an equivalent of Python's fractions.Fraction (bignum/arbitrary-precision fraction/rational number class)?是否有相当于 Python 的 fractions.Fraction (bignum/任意精度分数/有理数类)?
【发布时间】:2025-11-30 09:55:01
【问题描述】:

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

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

是否有一个库可以让我以直接的方式做到这一点?

【问题讨论】:

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


    【解决方案1】:

    如果您使用 boost,您可以将 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 字面量,您可以使用此辅助函数来不需要每次显式构造 cpp_int 对象创建分数:

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

    Usage:

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

    输出:

    5559683113745453573439198431/893650808144311844544465740142994088494601632782777989203248
    

    【讨论】: