C++ boost rational class, floor 函数
C++ boost rational class, floor function
我刚开始使用 boost。
除了简单地做 x.numerator()/x.denominator,在使用 boost 时是否有适当的 'boost-type' 方法来调用 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())
};
虽然这可能会让您有些失望,但它确实验证了您的方法,这很好。
如果需要,您可以提供自己的 floor
重载,以便通过 ADL 找到 ¹
这是我的通才建议,假设您将其注入命名空间 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
中声明它,以便让它启动。
我刚开始使用 boost。
除了简单地做 x.numerator()/x.denominator,在使用 boost 时是否有适当的 'boost-type' 方法来调用 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())
};
虽然这可能会让您有些失望,但它确实验证了您的方法,这很好。
如果需要,您可以提供自己的 floor
重载,以便通过 ADL 找到 ¹
这是我的通才建议,假设您将其注入命名空间 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
中声明它,以便让它启动。