0

我正在将 Boost.Multiprecision 用于 mpfr 后端的包装器,并且在将 pi(和 e 或任何其他数学常数)创建到我想要的精度时遇到了一些麻烦。我觉得我想做的事情应该是可能的,因为在Boost.Multiprecision的教程页面上使用了Boost.Math 作为常量。在本教程中,他们使用固定精度数的类型,例如——我想用 variable_precision 来做。查看以下代码:cpp_dec_float_50mpfr_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,正如输出语句的结果所证明的那样,它确认 mypi的精度为 1000,并打印大约 165 个正确数字,以及约 835零。这显然是错误的。

是否可以使用 boost::math::constants 中的常量填充高精度的 boost::multiprecision::mpfr_float?

请注意,我需要使用可变精度类型,并且不能选择其他高精度但固定精度的类型。我必须能够在运行时动态更改精度。

4

1 回答 1

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 位数字。你得到的任何数字都可能是不正确的!)

于 2015-02-13T03:12:02.657 回答