|
发表于 2022-5-19 03:01:44
|
显示全部楼层
原来是mpfr_t转long double出现了问题
其实根本不需要1e-4950,1e-150就可以精确到小数点后100位
- $ cat main.c
- #include <stdio.h>
- #include <mpfr.h>
- void get_pi(mpfr_t *result, const mpfr_t eps) {
- mpfr_t pi, a, b, temp;
- mpfr_inits2(65536, pi, a, b, temp, (mpfr_ptr)0);
- mpfr_set_ld(pi, 1, MPFR_RNDZ);
- mpfr_set_ld(a, 1, MPFR_RNDZ);
- mpfr_set_ld(b, 1, MPFR_RNDZ);
- for(size_t n = 1; ; ++n) {
- mpfr_mul_ui(a, a, n, MPFR_RNDZ);
- mpfr_mul_ui(b, b, 2 * n + 1, MPFR_RNDZ);
- mpfr_div(temp, a, b, MPFR_RNDZ);
- if(mpfr_cmp(temp, eps) < 0) break;
- mpfr_add(pi, pi, temp, MPFR_RNDZ);
- }
- mpfr_mul_ui(pi, pi, 2, MPFR_RNDZ);
- mpfr_set(*result, pi, MPFR_RNDZ);
- mpfr_clears(pi, a, b, temp, (mpfr_ptr)0);
- }
- int main(void) {
- mpfr_t eps, result;
- mpfr_inits2(65536, eps, result, (mpfr_ptr)0);
- mpfr_set_str(eps, "1e-150", 10, MPFR_RNDZ);
- get_pi(&result, eps);
- mpfr_printf("%.100Rf\n", result);
- mpfr_clears(eps, result, (mpfr_ptr)0);
- mpfr_free_cache();
- return 0;
- }
- $ gcc-debug -o main main.c $(pkg-config --cflags --libs mpfr)
- $ time ./main
- 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170680
- real 0m0.164s
- user 0m0.150s
- sys 0m0.014s
- $
复制代码 |
|