Как ясно показано в Увеличить мультипрецизионную библиотеку документация, это легко конвертировать из 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
)?
(Обратите внимание, что в моей программе только один экземпляр числа с плавающей запятой создается в любое время, и он обновляется нечасто, поэтому я согласен с тем, что этот экземпляр занимает много памяти и занимает много времени для поддержки огромное количество.)
Спасибо!
У меня нет большого опыта работы с 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);
Других решений пока нет …