Как преобразовать из boost :: multiprecision :: cpp_int в cpp_dec_float & lt; 0 & gt; (а не в cpp_dec_float_50 и т. д.)?

Как ясно показано в Увеличить мультипрецизионную библиотеку документация, это легко конвертировать из boost::multiprecision::cpp_int к boost::multiprecision::cpp_dec_float:

// Some interconversions between number types are completely generic,
// and are always available, albeit the conversions are always explicit:

cpp_int cppi(2);
cpp_dec_float_50 df(cppi);    // OK, int to float // <-- But fails with cpp_dec_float<0>!

Возможность конвертировать из cpp_int к типу с плавающей точкой фиксированной ширины (т.е. cpp_dec_float_50) дает надежду, что возможно будет преобразовать из cpp_int для произвольная ширина тип с плавающей точкой в ​​библиотеке — т.е. cpp_dec_float<0>, Тем не менее, это не работает; преобразование завершается неудачно для меня в Visual Studio 2013, как демонстрирует следующий простой пример программы:

#include <boost/multiprecision/number.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>

int main()
{
boost::multiprecision::cpp_int n{ 0 };
boost::multiprecision::cpp_dec_float<0> f{ n }; // Compile error in MSVC 2013
}

Это делает удалось преобразовать в cpp_dec_float_50Как и ожидалось, но, как уже было отмечено, я надеюсь преобразовать в тип с плавающей точкой произвольной точности: cpp_dec_float<0>,

Ошибка появляется в следующем фрагменте кода из внутреннего кода Boost Multiprecision в файле <boost/multiprecision/detail/default_ops.hpp>:

template <class R, class T>
inline bool check_in_range(const T& t)
{
// Can t fit in an R?
if(std::numeric_limits<R>::is_specialized && std::numeric_limits<R>::is_bounded
&& (t > (std::numeric_limits<R>::max)()))
return true;
return false;
}

Сообщение об ошибке:

ошибка C2784:
«Enable_if :: result_type, подробно :: выражение :: result_type> BOOL> :: тип
boost :: multiprecision :: operator> (const
повышение :: multiprecision :: подробнее :: выражение
&, Const
повышение :: multiprecision :: подробнее :: выражение &) ‘:
не удалось вывести аргумент шаблона для ‘const
повышение :: multiprecision :: подробнее :: выражение &’
из ‘const next_type’

Возможно ли преобразовать boost::multiprecision::cpp_int к boost::multiprecision::cpp_dec_float<0> (вместо преобразования в тип с плавающей запятой с фиксированной десятичной точностью, как в cpp_dec_float_50)?

(Обратите внимание, что в моей программе только один экземпляр числа с плавающей запятой создается в любое время, и он обновляется нечасто, поэтому я согласен с тем, что этот экземпляр занимает много памяти и занимает много времени для поддержки огромное количество.)

Спасибо!

4

Решение

У меня нет большого опыта работы с Boost Multiprecision, но мне кажется, что шаблон класса cpp_dec_float<> это то, что они называют бэкенд, и вам нужно обернуть его в number<> адаптер для того, чтобы использовать его как арифметический тип.

Вот мой взгляд на это: Жить на Колиру

#include <boost/multiprecision/number.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>

namespace mp = boost::multiprecision;

int main()
{
using Int = mp::cpp_int;

// let's think of a nice large number
Int n = 1;
for (Int f = 42; f>0; --f)
n *= f;

std::cout << n << "\n\n"; // print it for vanity

// let's convert it to cpp_dec_float
// and... do something with it
using Dec = mp::number<mp::cpp_dec_float<0> >;
std::cout << n.convert_to<Dec>();
}

Выход:

1405006117752879898543142606244511569936384000000000

1.40501e+51

Если convert_to<> разрешено, то конструктор явного преобразования также будет работать, я ожидаю:

Dec decfloat(n);
5

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

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

По вопросам рекламы [email protected]