簡體   English   中英

使用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.Multiprecision教程頁面上將Boost.Math用作常量 在本教程中,他們使用諸如cpp_dec_float_50之類的固定精度數字類型-我想使用variable_precision mpfr_float做到這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,但只有pi的約165位數字,這由輸出語句的結果證明,該輸出語句確定我的pi的精度為1000,並打印大約165個正確的數字,並且約835個零。 這顯然是錯誤的。

是否可以高精度地制作boost :: multiprecision :: mpfr_float並填充來自boost :: math :: constants的常量?

請注意,我需要使用可變精度類型,而其他的高精度但固定精度類型則不是一種選擇。 我必須能夠在運行時即時更改精度。

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位數字。超出的任何數字都可能不正確!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM