C++ 十进制算术库
C++ decimal arithmetic libraries
我对向 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 库具有任意整数类型,这可以接受吗?我唯一不喜欢将整数用于此类事情的是,在将利率与货币相乘之前,我可能必须将利率转换为整数,这可能会导致非常非常大的数字,这可能会或可能不会导致性能问题。
(假设 BOOST 不是我需要的)您对英特尔的十进制浮点库有何看法?我无法让它工作(还)所以我想知道它是否值得付出努力。还有其他类似的库值得一试吗?
因此,您正在为十进制变量分配一个数字(已经是浮点数)。所以你关心的错误已经介绍了。
相反,让我们为它分配一个包含正确数字的字符串:
#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
使用Python:
import decimal
d = decimal.Decimal("0.45")
print(d)
输出 0.45。
我对向 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 库具有任意整数类型,这可以接受吗?我唯一不喜欢将整数用于此类事情的是,在将利率与货币相乘之前,我可能必须将利率转换为整数,这可能会导致非常非常大的数字,这可能会或可能不会导致性能问题。
(假设 BOOST 不是我需要的)您对英特尔的十进制浮点库有何看法?我无法让它工作(还)所以我想知道它是否值得付出努力。还有其他类似的库值得一试吗?
因此,您正在为十进制变量分配一个数字(已经是浮点数)。所以你关心的错误已经介绍了。
相反,让我们为它分配一个包含正确数字的字符串:
#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
使用Python:
import decimal
d = decimal.Decimal("0.45")
print(d)
输出 0.45。