将 boost multiprecision 与三角函数结合使用
Using boost multiprecision with trigonometric function
考虑以下使用 boost 创建多精度浮点数 'a' 的代码。
如何使用boost库调用三角函数?
比如我希望计算sin(a)。
#include <iostream>
#include "boost/multiprecision/cpp_bin_float.hpp"
using namespace std;
using namespace boost::multiprecision;
typedef number<backends::cpp_bin_float<24, backends::digit_base_2, void, boost::int16_t, -126, 127>, et_off> float32;
int main (void) {
float32 a("0.5");
return 0;
}
图书馆似乎有限制。当精度降得太低时,sin
实现不再编译。
一些中间计算正在以 double
精度进行。结果类型的赋值是有损的,因此无法编译。
您选择的类型 actually corresponds 到 cpp_bin_float_single
。那不编译。
只要你 select cpp_bin_float_double
(精度为 53 位二进制数字)或更高,你就可以了。
我想这个限制在某些方面可以被视为一个错误。您可以将其报告给库开发人员,他们将能够判断相关代码是否可以在那里使用单精度浮点数而不影响 sin
近似的收敛。
#include <boost/multiprecision/cpp_bin_float.hpp>
#include <iostream>
using namespace std;
using namespace boost::multiprecision;
int main() {
cpp_bin_float_100 a = 1;
cout << setprecision(50) << endl;
cout << sin(a) << endl;
return 0;
}
我已经用 Wolfram Mathematica 验证了数字,它们是正确的:
考虑以下使用 boost 创建多精度浮点数 'a' 的代码。
如何使用boost库调用三角函数? 比如我希望计算sin(a)。
#include <iostream>
#include "boost/multiprecision/cpp_bin_float.hpp"
using namespace std;
using namespace boost::multiprecision;
typedef number<backends::cpp_bin_float<24, backends::digit_base_2, void, boost::int16_t, -126, 127>, et_off> float32;
int main (void) {
float32 a("0.5");
return 0;
}
图书馆似乎有限制。当精度降得太低时,sin
实现不再编译。
一些中间计算正在以 double
精度进行。结果类型的赋值是有损的,因此无法编译。
您选择的类型 actually corresponds 到 cpp_bin_float_single
。那不编译。
只要你 select cpp_bin_float_double
(精度为 53 位二进制数字)或更高,你就可以了。
我想这个限制在某些方面可以被视为一个错误。您可以将其报告给库开发人员,他们将能够判断相关代码是否可以在那里使用单精度浮点数而不影响 sin
近似的收敛。
#include <boost/multiprecision/cpp_bin_float.hpp>
#include <iostream>
using namespace std;
using namespace boost::multiprecision;
int main() {
cpp_bin_float_100 a = 1;
cout << setprecision(50) << endl;
cout << sin(a) << endl;
return 0;
}
我已经用 Wolfram Mathematica 验证了数字,它们是正确的: