使用 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.606531
,b
得到 1
。
我是 运行:boost 1.58,Linux,gcc 5.4.0。
知道我做错了什么吗?
这看起来像是 boost 中的错误。当指数模板参数是 64 位整数类型时,exp
的结果四舍五入为整数。当使用 int
代替 long long int
时,不会发生这种情况。
编辑:我已将错误追踪到 floor
和 ceil
函数的错误实现。两种情况下的违规行是:
if((arg.exponent() > (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent) || (shift <= 0))
// --- <=== !!!!
在 include/boost/multiprecision/cpp_bin_float.hpp
.
我尝试了以下方法:
#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。
知道我做错了什么吗?
这看起来像是 boost 中的错误。当指数模板参数是 64 位整数类型时,exp
的结果四舍五入为整数。当使用 int
代替 long long int
时,不会发生这种情况。
编辑:我已将错误追踪到 floor
和 ceil
函数的错误实现。两种情况下的违规行是:
if((arg.exponent() > (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent) || (shift <= 0))
// --- <=== !!!!
在 include/boost/multiprecision/cpp_bin_float.hpp
.