C++ Boost有理数类和向下取整函数

4

我刚开始使用boost。

除了简单地使用x.numerator()/x.denominator,当使用boost有理数库时,是否有一种适当的“boost类型”方式来调用floor(x)函数(即朝零方向截断)?

谢谢

1个回答

3

没有。我仔细研究了它,甚至与转换为连分数表示有关的唯一函数也是以完全相同的操作开始的(为了易读性格式化):

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()) 
};

虽然这可能会让你稍微失望,但这验证了你的方法,这是好事。

如果你想的话,你可以提供自己的 floor 重载,通过ADL进行查找 ¹

以下是我的通用建议,假设你将其注入到命名空间 boost 中:

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

演示

在Coliru上实时演示

#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内声明。


谢谢您的回复。我期望我会做类似于您建议的事情。为什么 Boost 库中没有包含 floor 函数呢?对我来说,不包括 floor 和 ceiling 函数有点疏忽。 - ppyvabw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接