我在mpfr后端使用Boost.Multiprecision包装器,我在创建pi(和e或任何其他数学常量)时遇到了一些麻烦。由于在Boost.Math for constants上使用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吗?
请注意,我需要才能使用变量精度类型,而其他高但固定精度类型则不是选项。我必须能够在运行时动态改变精度。
答案 0 :(得分:2)
Boost标头中嵌入的常量具有有限的精度,您已达到该限制。如果您需要更高精度的pi版本(例如),您需要自己携带它。
例如,标题中boost::math::constants::pi
的定义是:
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位数字。你得到的任何数字都可能不正确!)