C++提升理性类,地板功能

C++ boost rational class, floor function

本文关键字:功能 理性 C++      更新时间:2023-10-16

我是使用boost的新手。

除了简单地执行 x.numerator()/x.denominator 之外,在使用 boost 理性库时,是否有一种适当的"提升型"方法来调用 floor(x) 函数(即截断到零)?

谢谢

没有

。我已经仔细研究了它,唯一处理转换为连续分数表示的函数以完全相同的操作开始(为易读性而格式化):

struct {
    Rat::int_type n, d, q, r;
} ts = {
    l.numerator(), l.denominator(),
    static_cast<Rat::int_type>(l.numerator() / l.denominator()), static_cast<Rat::int_type>(l.numerator() % l.denominator()) 
},
  rs = {
      r.numerator(), r.denominator(),
      static_cast<Rat::int_type>(r.numerator() / r.denominator()), static_cast<Rat::int_type>(r.numerator() % r.denominator()) 
};

虽然这可能会让你有点失望,但它确实验证了你的方法,这很好。

如果需要,您可以通过 ADL ¹ 提供自己的floor重载

这是我的通才建议,假设您将其注入命名空间boost

namespace boost {
    template <typename IntType>
    constexpr IntType floor(rational<IntType> const& r) {
        return static_cast<IntType>(r.numerator() / r.denominator());
    }
}

现场演示

住在科里鲁

#include <boost/rational.hpp>
namespace boost {
    template <typename IntType>
    constexpr IntType floor(rational<IntType> const& r) {
        return static_cast<IntType>(r.numerator() / r.denominator());
    }
}
#include <iostream>
template <typename IntType> void test()
{
    boost::rational<IntType> a(230,7), b(222*111111,-777777);
    std::cout << "a: " << a << " -> " << floor(a) << "n";
    std::cout << "b: " << b << " -> " << floor(b) << "n";
}
#include <boost/multiprecision/cpp_int.hpp>
int main() {
    test<int>();
    test<boost::multiprecision::cpp_int>();
}

指纹

a: 230/7 -> 32
b: -222/7 -> -31
a: 230/7 -> 32
b: -222/7 -> -31

¹ 在声明整数类型的命名空间中声明它,或在命名空间::boost中声明它,以便让它启动。