gpt4 book ai didi

c++ - 使用 Boost mpfr_float 创建可变精度的数学常量,例如 pi 或 e

转载 作者:行者123 更新时间:2023-11-28 02:32:50 24 4
gpt4 key购买 nike

我在 mpfr 后端周围使用 Boost.Multiprecision 作为包装器,我在创建 pi(和 e 或任何其他数学常量)达到我想要的精度时遇到了一些问题。我觉得我想做的事情应该是可能的,因为使用了 Boost.Math for constantstutorial 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::multiprecision::mpfr_float 并填充来自 boost::math::constants 的常量?

请注意,我需要使用可变精度类型,而其他高精度但固定精度的类型不是一个选项。我必须能够在运行时即时更改精度。

最佳答案

Boost header 中嵌入的常量具有有限的精度,而您已经达到了该限制。如果您需要更高精度的 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 位数字。任何超过这个数字的数字都可能是不正确的!)

关于c++ - 使用 Boost mpfr_float 创建可变精度的数学常量,例如 pi 或 e,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28491820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com