使用 Boost mpfr_float 创建可变精度的数学常量,例如 pi 或 e
creating math constants of variable precision using Boost mpfr_float, such as pi or e
我正在使用 Boost.Multiprecision 作为 mpfr 后端的包装器,但我在创建 pi(和 e 或任何其他数学常数)达到我想要的精度时遇到了一些问题。我觉得我想做的事情应该是可能的,因为使用了Boost.Math for constants on a tutorial page for Boost.Multiprecision。在本教程中,他们使用 cpp_dec_float_50
等类型的固定精度数字——我想用 variable_precision mpfr_float
来实现。查看以下代码:
#include <boost/multiprecision/mpfr.hpp>
#include <boost/math/constants/constants.hpp>
#include <iostream>
...
int main() {
boost::multiprecision::mpfr_float::default_precision(1000);
boost::multiprecision::mpfr_float pi = boost::math::constants::pi<boost::multiprecision::mpfr_float>();
std::cout << std::fixed;
std::cout.precision(1000);
std::cout << pi.precision() << " " << pi << std::endl;
}
结果是一个数字,pi
,精度为 1000,但只有 ~165 位 pi,正如输出语句的结果所证明的那样,这证实了我的 pi
精度为 1000,并打印大约 165 个正确数字和 ~835 个零。这显然是错误的。
是否可以使用 boost::math::constants 中的常量以高精度填充 boost::multiprecision::mpfr_float?
请注意,我需要使用可变精度类型,其他高精度但固定精度的类型不是一个选项。我必须能够在运行时即时更改精度。
Boost headers 中嵌入的常量具有有限的精度,而您已达到该限制。如果您需要 higher-precision 版本的 pi(例如),您需要自己携带。
比如boost::math::constants::pi
在headers中的定义是:
BOOST_DEFINE_MATH_CONSTANT(pi, 3.141592653589793238462643383279502884e+00, "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+00")
—https://github.com/boostorg/math/blob/master/include/boost/math/constants/constants.hpp
(顺便说一句,这个定义只给出了小数点后 110 位数字。超出这个数字的任何数字都可能不正确!)
我正在使用 Boost.Multiprecision 作为 mpfr 后端的包装器,但我在创建 pi(和 e 或任何其他数学常数)达到我想要的精度时遇到了一些问题。我觉得我想做的事情应该是可能的,因为使用了Boost.Math for constants on a tutorial page for Boost.Multiprecision。在本教程中,他们使用 cpp_dec_float_50
等类型的固定精度数字——我想用 variable_precision mpfr_float
来实现。查看以下代码:
#include <boost/multiprecision/mpfr.hpp>
#include <boost/math/constants/constants.hpp>
#include <iostream>
...
int main() {
boost::multiprecision::mpfr_float::default_precision(1000);
boost::multiprecision::mpfr_float pi = boost::math::constants::pi<boost::multiprecision::mpfr_float>();
std::cout << std::fixed;
std::cout.precision(1000);
std::cout << pi.precision() << " " << pi << std::endl;
}
结果是一个数字,pi
,精度为 1000,但只有 ~165 位 pi,正如输出语句的结果所证明的那样,这证实了我的 pi
精度为 1000,并打印大约 165 个正确数字和 ~835 个零。这显然是错误的。
是否可以使用 boost::math::constants 中的常量以高精度填充 boost::multiprecision::mpfr_float?
请注意,我需要使用可变精度类型,其他高精度但固定精度的类型不是一个选项。我必须能够在运行时即时更改精度。
Boost headers 中嵌入的常量具有有限的精度,而您已达到该限制。如果您需要 higher-precision 版本的 pi(例如),您需要自己携带。
比如boost::math::constants::pi
在headers中的定义是:
BOOST_DEFINE_MATH_CONSTANT(pi, 3.141592653589793238462643383279502884e+00, "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+00")
—https://github.com/boostorg/math/blob/master/include/boost/math/constants/constants.hpp
(顺便说一句,这个定义只给出了小数点后 110 位数字。超出这个数字的任何数字都可能不正确!)