Ошибка при компиляции библиотеки boost

181
28 апреля 2018, 18:26

Пытаюсь из библиотеки boost использовать float128. Подключаю так:

#include <boost/multiprecision/float128.hpp>
namespace mp = boost::multiprecision;
mp::float128 N = 0;

Выдает ошибку: #error: "Sorry compiler is neither GCC, not Intel, don't know how to configure this header." В чем ошибка?Или подскажите какой тип данных из этой библиотеки можно использовать для работы с большим числом с плавающей точкой.

Update

Как взаимодействовать теперь целый тип из boost c float? Получается так: Подключаю библиотеку:

#include <boost/multiprecision/cpp_bin_float.hpp>
namespace mp = boost::multiprecision;
mp::cpp_bin_float_quad N = 1010.5;
mp::cpp_int a=5;

Теперь когда я это число пытаюсь поделить на целое большое число из этой библиотеки:

N/=5;

выдает ошибку:отсутствует оператор "/=", соответствующий этим операндам. Как можно одновременно использовать два этих типа?

Answer 1

Как говорит документация Boost'а:

The float128 number type is a very thin wrapper around GCC's float128 or Intel's _Quad data types and provides an real-number type that is a drop-in replacement for the native C++ floating-point types, but with a 113 bit mantissa, and compatible with FORTRAN's 128-bit QUAD real.

Т.е. это всего лишь обёртка на типом float128 из gcc. Использовать его с другими компиляторами не получится. О чём и говорится в ошибке.

Реализация в хедерах двоичной плавающей арифметики с произвольной точностью от boost'а называется cpp_bin_float. По факту это единственный FP-backend за пределами GNU мира. Относительно медленный, зато без зависимостей.

Аналогом непосредственно float128 является тип cpp_bin_float_quad.

#include <boost/multiprecision/cpp_bin_float.hpp>
using namespace boost::multiprecision;
cpp_bin_float_quad N = 0;

Update

Для того чтобы использовать разные типы из библиотек произвольной точности boost'а в одном выражении их необходимо явно приводить к одному одним из способов, например с помощью шаблона convert_to<>():

#include <iostream>
#include <boost/multiprecision/cpp_bin_float.hpp>
#include <boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;
int main(void) {
    cpp_bin_float_quad fpN = 1;
    cpp_int iN = 5;
    cpp_bin_float_quad fp2;
    fpN /= iN.convert_to<cpp_bin_float_quad>();
    std::cout << fpN;
    return 0;
}
READ ALSO
Как принудительно завершить поток?

Как принудительно завершить поток?

С помощью async запускаю в main поток, в котором крутится бесконечный циклКак завершить этот поток?

187
Удаление бинарного дерева

Удаление бинарного дерева

Имеются функции:

143
Помогите разобраться с исключениями C++

Помогите разобраться с исключениями C++

Проблема в том чтобы после выполнения исключения Owerwriting программа продолжила работу и копировала файл,у меня она просто выдает исключение...

194
Не получается создать проект C++ в Visual Studio 2017

Не получается создать проект C++ в Visual Studio 2017

Когда я пытаюсь создать/открыть проект Visual C++, я получаю такое сообщение:

213