提升多精度 cpp_int 乘以浮点数

Posted

技术标签:

【中文标题】提升多精度 cpp_int 乘以浮点数【英文标题】:Boost multiprecision cpp_int multiplied by a float 【发布时间】:2018-01-22 14:37:37 【问题描述】:

可以将 boost 多精度 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】:

不支持,因为它是有损的。

您可以显式进行转换:

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

警告

一个常见的缺陷是惰性求值的表达式模板。使用临时人员时它们是一个陷阱:

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

之后使用result 是Undefined Behaviour,因为临时对象已被销毁。分配给 bigfloat 会强制执行评估。

【讨论】:

以上是关于提升多精度 cpp_int 乘以浮点数的主要内容,如果未能解决你的问题,请参考以下文章

单精度和双精度有啥不同?

Boost 的多精度模拟低精度快速浮点数

IEEE 754 浮点数的表示精度探讨

Abplc浮点数怎么传给4个字节

js 后端返回浮点数,前端用乘法或者除法处理,得到超常值

使用 SSE 将 4 个浮点数乘以 4 个浮点数的最有效方法是啥?