The following program computes a lower bound on 1+1/1!+1/2!+...+1/100! using a 200-bit precision:

`mpfr_t s, t, u;`

declares three floating-point variables`s`,`t`,`u`;`mpfr_init2 (t, 200);`

initializes the variable`t`with a 200-bit precision;`mpfr_set_d (t, 1.0, MPFR_RNDD);`

sets the value of`t`to the double-precision number 1.0 rounded toward minus infinity (here no rounding is involved since 1 is represented exactly as a double-precision number and also as a 200-bit MPFR number);- the statement
`mpfr_mul_ui (t, t, i, MPFR_RNDU);`

multiplies`t`in place by the unsigned integer`i`, where the result is rounded toward plus infinity; `mpfr_div (u, u, t, MPFR_RNDD);`

divides`u`by`t`, rounding the result toward minus infinity, and stores it in`u`;- the statement
`mpfr_out_str (stdout, 10, 0, s, MPFR_RNDD);`

prints the value of`s`in base 10, rounded toward minus infinity, where the third argument 0 means that the number of printed digits is automatically chosen from the precision of`s`(note:`mpfr_printf`

could also be used instead of`printf`

,`mpfr_out_str`

and`putchar`

); - finally the
`mpfr_clear`

and`mpfr_free_cache`

calls free the space used by the MPFR variables and caches.

Note: with this program, you need MPFR 3.0 or later.

#include <stdio.h> #include <gmp.h> #include <mpfr.h> int main (void) { unsigned int i; mpfr_t s, t, u; mpfr_init2 (t, 200); mpfr_set_d (t, 1.0, MPFR_RNDD); mpfr_init2 (s, 200); mpfr_set_d (s, 1.0, MPFR_RNDD); mpfr_init2 (u, 200); for (i = 1; i <= 100; i++) { mpfr_mul_ui (t, t, i, MPFR_RNDU); mpfr_set_d (u, 1.0, MPFR_RNDD); mpfr_div (u, u, t, MPFR_RNDD); mpfr_add (s, s, u, MPFR_RNDD); } printf ("Sum is "); mpfr_out_str (stdout, 10, 0, s, MPFR_RNDD); putchar ('\n'); mpfr_clear (s); mpfr_clear (t); mpfr_clear (u); mpfr_free_cache (); return 0; }

The result of this program is:

$ ./sample Sum is 2.7182818284590452353602874713526624977572470936999595749669131e0

Note that the fix that adds the exponent `e0` in the `mpfr_out_str`

output is mentioned on the MPFR 4.0.2 page.