使用 boost::multiprecision 中的 cpp_bin_float 浮点数学运算出错

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

我尝试了以下方法:

#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.606531b 得到 1

我是 运行:boost 1.58,Linux,gcc 5.4.0。

知道我做错了什么吗?

这看起来像是 boost 中的错误。当指数模板参数是 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.