0

mpfr バックエンドのラッパーに Boost.Multiprecision を使用していますが、希望の精度で pi (および e またはその他の数学定数) を作成する際に問題が発生しています。Boost.Multiprecision のチュートリアルページで定数にBoost.Math を使用しているため、やりたいことが可能になるはずです。チュートリアルでは、 - I want to do it with 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 桁しかありません。これは、 mypiが精度 1000 であることを確認し、約 165 の正しい桁を出力し、約 835 を出力します。ゼロ。これは明らかに間違っています。

boost::multiprecision::mpfr_float を高精度で、boost::math::constants の定数を使用して作成することは可能ですか?

可変精度型を使用する必要があることに注意してください。また、他の高精度で固定精度の型はオプションではないことに注意してください。実行時にオンザフライで精度を変更できる必要があります。

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 に答える