使用cpp_dec_float增强使用pow功能

时间:2016-01-27 16:12:06

标签: c++ boost

我正在使用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))
                          ^

1 个答案:

答案 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 字面值!

背景资料: