提升多精度cpp_int乘以浮点数

时间:2018-01-22 14:37:37

标签: c++ boost boost-multiprecision

可以将boost 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 个答案:

答案 0 :(得分:1)

不支持,因为它有损。

您可以明确地进行转换:

<强> Live On Coliru

#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

CAVEAT

常见的陷阱是延迟评估的表达模板。在使用临时工时,它们是一个陷阱:

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

之后使用resultUndefined Behaviour,因为临时工已被摧毁。分配给bigfloat会强制进行评估。