C ++十进制算术库

时间:2015-01-25 06:15:54

标签: c++ boost

我很擅长在Visual Studio(2013)中添加额外的库,以及在处理某些事情(如金钱)时浮动和双打通常不够准确的想法。我原本以为BOOST :: Multiprecision cpp_dec_float会解决这个问题,但是当我测试它时,我发现了一些不寻常的东西,并意识到我可能是错的。例如,

cpp_dec_float_50 decimal = 0.45;
double dbl = 0.45; //for comparison

cout << fixed << setprecision(50) << "boost:    " << decimal << endl;
cout << "double:  " << dbl << endl;

会给出这样的结果

boost:    0.45000000000000001110223024625156540423631668090820
double:   0.45000000000000001000000000000000000000000000000000

而不是我的预期(0.45000000000000000000000000000000000000000000000000)。

这不是比使用花车或双打更准确吗?如果没有,我假设我刚刚链接到我的VS2013的升级库有一个任意整数类型,这是可以接受的吗?对于这样的事情,我唯一不喜欢使用整数的是我可能不得不在将利率乘以货币之前将利率转换为整数,这可能会导致非常非常大的数字,这可能会或可能不会导致表现问题。

(假设BOOST不是我需要的)你对英特尔的十进制浮点库有什么看法?我无法让它工作(还),所以我想知道它是否值得付出努力。还有其他类似的图书馆值得一试吗?

1 个答案:

答案 0 :(得分:14)

因此,您要为您的十进制变量分配一个数字(已经是浮点数)。所以你所关注的错误已经被引入。

相反,让我们为它分配一个包含正确数字的字符串:

#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>
using namespace std;
using boost::multiprecision::cpp_dec_float_50;

int main() {
    cpp_dec_float_50 decimal("0.45");
    double dbl = 0.45; //for comparison

    cout << fixed << setprecision(50) << "boost:   " << decimal << endl;
    cout << "double:  " << dbl << endl;
}

哪个输出:

boost:   0.45000000000000000000000000000000000000000000000000
double:  0.45000000000000001110223024625156540423631668090820