Boost Использование функции pow с cpp_dec_float

Я использую 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

Решение

Здесь есть ряд подводных камней. Смотрите добавленные ссылки внизу.


Что-то подсказывает мне, что вы использовали бэкэнд-тип, а не интерфейс внешнего интерфейса (например, number<> или же 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 а также cpp_dec_float, Это означает, что вы не выиграете много — если что-нибудь в сценарии — от улучшенной точности или десятичного представления Boost Multiprecision.

Вместо этого попробуйте пройти весь путь:

Жить на Колиру

#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;
}

Печать:

172.601
172.601
true

Обратите внимание на CRUCIAL инициализацию от текст, не double буквальный!


Справочная информация:

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector