Повышение мультиточности cpp_int, умноженное на число с плавающей точкой

Можно ли умножить надстройку multiprecision int на число с плавающей запятой? Это не поддерживается?

using bigint = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<>>;

boost::multiprecision::bigint x(12345678);
auto result = x * 0.26   // << THIS LINE DOES NOT COMPILE

1

Решение

Нет, это не поддерживается, потому что это с потерями.

Вы можете сделать преобразование явно:

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

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

//using bigint = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<>>;
using bigint   = boost::multiprecision::cpp_int;
using bigfloat = boost::multiprecision::cpp_dec_float_50;

int main() {
bigint x(12345678);
bigfloat y("0.26");
std::cout << "x: " << x << "\n";
std::cout << "y: " << y << "\n";
bigfloat result = x.convert_to<bigfloat>() * y;

//bigint z = result; // lossy conversion will not compile
bigint z1 = static_cast<bigint>(result);
bigint z2 = result.convert_to<bigint>();

std::cout << "Result: " << result << "\n";
std::cout << "z1: " << z1 << "\n";
std::cout << "z2: " << z2 << "\n";
}

Печать

x: 12345678
y: 0.26
Result: 3.20988e+06
z1: 3209876
z2: 3209876

ПРЕДОСТЕРЕЖЕНИЕ

Распространенной ошибкой являются лениво оцененные шаблоны выражений. Они ловушка при использовании временных:

auto result = x.convert_to<bigfloat>() * bigfloat("0.26");

С помощью result после этого Неопределенное поведение, потому что временные были уничтожены. Назначение bigfloat заставляет оценку.

1

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

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