我正在使用pow()
函数,我正在尝试将返回值与cpp_dec_float
进行比较,但我收到错误
代码:
pow(sqrt(172.601), 2) != n);
错误:
UserPath\main.cpp:21: error: no match for 'operator!=' (operand types are '__gnu_cxx::__promote_2<double, int, double, double>::__type {aka double}' and 'boost::multiprecision::cpp_int {aka boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<> >}')
pow(sqrt(172.601), 2) != n))
^
答案 0 :(得分:2)
这里有许多陷阱。请参阅底部添加的链接。
有些东西告诉我你一直在使用后端类型,而不是前端适配器(如void f3(int (*arr)[10]); // Expects a pointer to an array of 10 int
或number<>
)。
事情没有改变:
<强> Live On Coliru 强>
rational_adaptor<>
打印
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>
int main() {
boost::multiprecision::cpp_dec_float_50 n = 3;
bool ok = pow(sqrt(172.601), 2) != n;
std::cout << std::boolalpha << ok;
}
您正在混合true
和double
。这意味着你在Boost Multiprecision的增强精度或十进制表示中没有获得太多 - 如果在场景中有任何改进。
相反,请考虑全程:
<强> Live On Coliru 强>
cpp_dec_float
打印:
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>
int main() {
typedef boost::multiprecision::cpp_dec_float_50 Decimal;
Decimal n("172.601");
Decimal other = pow(sqrt(Decimal("172.601")), 2);
std::cout << std::setprecision(50) << n << "\n";
std::cout << std::setprecision(50) << other << "\n";
bool equal = (abs(other - n) < std::numeric_limits<Decimal>::epsilon());
std::cout << std::boolalpha << equal;
}
请注意 text 的CRUCIAL初始化,而不是172.601
172.601
true
字面值!
背景资料: