我正在使用Ramanujan公式进行Pi的计算,直到我决定打印结果为止,一切都很好。
我将其转换为字符串,如下所示:
auto pi_str = std::string(mpfr_get_str(NULL, &exp, 10, programOptions->GetPrecision(), pi, MPFR_RNDN));
programOptions->GetPrecision()
是我程序的某些输入参数,但在失败时为100。
仅当配置为Release(发布)时,它才在get_str.c at line 157.
中失败,我对MPFR还是陌生的,我不知道如何进行。你们偶然发现了这种情况吗?
我将显示所需的更多代码或信息,但我真的认为这应该足够了。我的mpfr版本是4.0.1。
mpfr_dump
的输出:
0.0000000000000000000000000000010010001100000000111100101100000000011011110111110010010110011010000000E-1!!!N!!!
断言失败的输出:
C:\projects\vcpkg\buildtrees\mpfr\src\mpfr-4.0.1\src\get_str.c:157: MPFR assertion failed: size_s1 >= m
在 Debug 配置中输出mpfr_dump
:
0.1010001011111001100000110110111001001110010001000001010100101001111111000010011101010111110100100000E-1
精度通过以下行设置:
mpfr_set_default_prec(programOptions->GetPrecision());
Pi的计算方式如下:
mpfr_t pi;
mpfr_init(pi);
mpfr_set_d(pi, 0.0, MPFR_RNDN);
for (auto threadId = 0; threadId < futures.size(); ++threadId)
mpfr_add(pi, pi, futures[threadId].get(), MPFR_RNDN);