浮点数学出错使用来自 boost::multiprecision 的cpp_bin_float

Floating point math going wrong using cpp_bin_float from boost::multiprecision

本文关键字:multiprecision cpp float bin boost 出错 浮点数      更新时间:2023-10-16

我尝试了以下方法:

#include <cmath>
#include <iostream>
#include <boost/multiprecision/cpp_bin_float.hpp>
using float256 = boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<192,
                  boost::multiprecision::backends::digit_base_2, void, long long int>, boost::multiprecision::et_off>;
void Test()
{
   double a = exp(-0.5);
   double b = boost::multiprecision::exp(float256(-0.5)).convert_to<double>();
   cout << a << endl << b << endl;
}

不幸的是,这不起作用。我a 0.606531,但b 1.

我正在运行:boost 1.58,Linux,gcc 5.4.0。

知道我做错了什么吗?

看起来像是提升中的一个错误。当指数模板参数为 64 位整数类型时,exp的结果将舍入为整数。当使用int代替long long int时,不会发生这种情况。

编辑:我已经跟踪了错误,以错误地实现floorceil函数。两种情况下的违规行为都是:

if((arg.exponent() > (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent) || (shift <= 0))
//                    --- <=== !!!!

include/boost/multiprecision/cpp_bin_float.hpp.