Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <gmp.h>
- #define L2_INFILE "ln_2.txt"
- void taylor_log(mpf_t, const mpf_t, const mpf_t);
- void hyperbolic_log(mpf_t, const mpf_t, const mpf_t);
- int main(int argc, char **argv)
- {
- unsigned long p, n, e, c;
- mpf_t N, T, R, V, nlog2, tmp;
- FILE *l_2_in;
- sscanf(argv[3], "%lu", &p);
- mpf_set_default_prec(p);
- l_2_in = fopen(L2_INFILE, "r");
- mpf_init(nlog2);
- mpf_inp_str(nlog2, l_2_in, 10);
- fclose(l_2_in);
- mpf_init_set_str(N, argv[1], 10);
- sscanf(argv[2], "%lu", &n);
- mpf_init_set_ui(T, 10);
- mpf_pow_ui(T, T, n);
- mpf_ui_div(T, 1, T);
- mpf_init(V);
- mpf_set_d(V, mpf_get_d_2exp(&e, N));
- mpf_init(R);
- mpf_init(tmp);
- printf("%ld\n", e);
- gmp_printf("%.*Ff\n", 20, V);
- sscanf(argv[4], "%lu", &c);
- switch(c)
- {
- case 1:
- printf("Case 1\n");
- taylor_log(R, V, T);
- break;
- case 2:
- printf("Case 2\n");
- hyperbolic_log(R, V, T);
- break;
- default:
- printf("ERROR: Incorrect choice of function\n");
- printf("Please choose from the following options\n");
- printf("1:\tTaylor expansion method\n");
- printf("2:\tHyperbolic expansion method\n");
- return 1;
- }
- mpf_mul_ui(tmp, nlog2, e);
- mpf_add(R, R, tmp);
- gmp_printf("%.*Ff\n", n, R);
- }
- void taylor_log(mpf_t R,
- const mpf_t N,
- const mpf_t T)
- {
- mpf_t x, y, r, pr, tmp, d;
- int n = 1;
- mpf_init(x);
- mpf_init(y);
- mpf_init(tmp);
- mpf_init(d);
- mpf_sub_ui(x, N, 1);
- mpf_init_set(y, x);
- mpf_init_set(r, x);
- mpf_init_set_ui(pr, 0);
- mpf_sub(d, r, pr);
- mpf_abs(d, d);
- while(mpf_cmp(d, T) > 0)
- {
- mpf_set(pr, r);
- mpf_mul(y, y, x);
- mpf_div_ui(tmp, y, ++n);
- mpf_sub(r, r, tmp);
- mpf_mul(y, y, x);
- mpf_div_ui(tmp, y, ++n);
- mpf_add(r, r, tmp);
- mpf_sub(d, r, pr);
- mpf_abs(d,d);
- }
- printf("%d\n", n);
- mpf_set(R, r);
- }
- void hyperbolic_log(mpf_t R,
- const mpf_t N,
- const mpf_t T)
- {
- mpf_t x, x2, r, pr, tmp, d;
- int n = 1;
- mpf_init(x);
- mpf_init(x2);
- mpf_init(tmp);
- mpf_init(d);
- mpf_sub_ui(x, N, 1);
- mpf_add_ui(tmp, N, 1);
- mpf_div(x, x, tmp);
- mpf_init_set(r, x);
- mpf_init_set_ui(pr, 0);
- mpf_mul(x2, x, x);
- mpf_sub(d, r, pr);
- mpf_abs(d,d);
- while(mpf_cmp(d, T) > 0)
- {
- mpf_set(pr, r);
- ++n;
- mpf_mul(x, x, x2);
- mpf_div_ui(tmp, x, ++n);
- mpf_add(r, r, tmp);
- mpf_sub(d, r, pr);
- mpf_abs(d,d);
- }
- printf("%d\n", n);
- mpf_mul_ui(R, r, 2);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement