#include <tgmath.h>
#include <gmp.h>
#include <mpfr.h>
#include <stdio.h>
#include <stdbool.h>

char *name = "Falkner and Boettcher, Appendix A";

double f_if(float a, float k, float m) {
        float r33314 = a;
        float r33315 = k;
        float r33316 = m;
        float r33317 = pow(r33315, r33316);
        float r33318 = r33314 * r33317;
        float r33319 = 1;
        float r33320 = 10;
        float r33321 = r33320 * r33315;
        float r33322 = r33319 + r33321;
        float r33323 = r33315 * r33315;
        float r33324 = r33322 + r33323;
        float r33325 = r33318 / r33324;
        return r33325;
}

double f_id(double a, double k, double m) {
        double r33326 = a;
        double r33327 = k;
        double r33328 = m;
        double r33329 = pow(r33327, r33328);
        double r33330 = r33326 * r33329;
        double r33331 = 1;
        double r33332 = 10;
        double r33333 = r33332 * r33327;
        double r33334 = r33331 + r33333;
        double r33335 = r33327 * r33327;
        double r33336 = r33334 + r33335;
        double r33337 = r33330 / r33336;
        return r33337;
}


double f_of(float a, float k, float m) {
        float r33338 = k;
        float r33339 = m;
        float r33340 = pow(r33338, r33339);
        float r33341 = 1;
        float r33342 = r33340 / r33341;
        float r33343 = a;
        float r33344 = 10;
        float r33345 = r33344 + r33338;
        float r33346 = r33345 * r33338;
        float r33347 = r33341 + r33346;
        float r33348 = r33343 / r33347;
        float r33349 = r33342 * r33348;
        return r33349;
}

double f_od(double a, double k, double m) {
        double r33350 = k;
        double r33351 = m;
        double r33352 = pow(r33350, r33351);
        double r33353 = 1;
        double r33354 = r33352 / r33353;
        double r33355 = a;
        double r33356 = 10;
        double r33357 = r33356 + r33350;
        double r33358 = r33357 * r33350;
        double r33359 = r33353 + r33358;
        double r33360 = r33355 / r33359;
        double r33361 = r33354 * r33360;
        return r33361;
}

void mpfr_fmod2(mpfr_t r, mpfr_t n, mpfr_t d, mpfr_rnd_t rmd) {
        mpfr_fmod(r, n, d, rmd);
        if (mpfr_cmp_ui(r, 0) < 0) mpfr_add(r, r, d, rmd);
}


static mpfr_t r33362, r33363, r33364, r33365, r33366, r33367, r33368, r33369, r33370, r33371, r33372, r33373;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r33362);
        mpfr_init(r33363);
        mpfr_init(r33364);
        mpfr_init(r33365);
        mpfr_init(r33366);
        mpfr_init_set_str(r33367, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r33368, "10", 10, MPFR_RNDN);
        mpfr_init(r33369);
        mpfr_init(r33370);
        mpfr_init(r33371);
        mpfr_init(r33372);
        mpfr_init(r33373);
}

double f_im(double a, double k, double m) {
        mpfr_set_d(r33362, a, MPFR_RNDN);
        mpfr_set_d(r33363, k, MPFR_RNDN);
        mpfr_set_d(r33364, m, MPFR_RNDN);
        mpfr_pow(r33365, r33363, r33364, MPFR_RNDN);
        mpfr_mul(r33366, r33362, r33365, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r33369, r33368, r33363, MPFR_RNDN);
        mpfr_add(r33370, r33367, r33369, MPFR_RNDN);
        mpfr_mul(r33371, r33363, r33363, MPFR_RNDN);
        mpfr_add(r33372, r33370, r33371, MPFR_RNDN);
        mpfr_div(r33373, r33366, r33372, MPFR_RNDN);
        return mpfr_get_d(r33373, MPFR_RNDN);
}

static mpfr_t r33374, r33375, r33376, r33377, r33378, r33379, r33380, r33381, r33382, r33383, r33384, r33385;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r33374);
        mpfr_init(r33375);
        mpfr_init(r33376);
        mpfr_init_set_str(r33377, "1", 10, MPFR_RNDN);
        mpfr_init(r33378);
        mpfr_init(r33379);
        mpfr_init_set_str(r33380, "10", 10, MPFR_RNDN);
        mpfr_init(r33381);
        mpfr_init(r33382);
        mpfr_init(r33383);
        mpfr_init(r33384);
        mpfr_init(r33385);
}

double f_fm(double a, double k, double m) {
        mpfr_set_d(r33374, k, MPFR_RNDN);
        mpfr_set_d(r33375, m, MPFR_RNDN);
        mpfr_pow(r33376, r33374, r33375, MPFR_RNDN);
        ;
        mpfr_div(r33378, r33376, r33377, MPFR_RNDN);
        mpfr_set_d(r33379, a, MPFR_RNDN);
        ;
        mpfr_add(r33381, r33380, r33374, MPFR_RNDN);
        mpfr_mul(r33382, r33381, r33374, MPFR_RNDN);
        mpfr_add(r33383, r33377, r33382, MPFR_RNDN);
        mpfr_div(r33384, r33379, r33383, MPFR_RNDN);
        mpfr_mul(r33385, r33378, r33384, MPFR_RNDN);
        return mpfr_get_d(r33385, MPFR_RNDN);
}

static mpfr_t r33386, r33387, r33388, r33389, r33390, r33391, r33392, r33393, r33394, r33395, r33396, r33397;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r33386);
        mpfr_init(r33387);
        mpfr_init(r33388);
        mpfr_init_set_str(r33389, "1", 10, MPFR_RNDN);
        mpfr_init(r33390);
        mpfr_init(r33391);
        mpfr_init_set_str(r33392, "10", 10, MPFR_RNDN);
        mpfr_init(r33393);
        mpfr_init(r33394);
        mpfr_init(r33395);
        mpfr_init(r33396);
        mpfr_init(r33397);
}

double f_dm(double a, double k, double m) {
        mpfr_set_d(r33386, k, MPFR_RNDN);
        mpfr_set_d(r33387, m, MPFR_RNDN);
        mpfr_pow(r33388, r33386, r33387, MPFR_RNDN);
        ;
        mpfr_div(r33390, r33388, r33389, MPFR_RNDN);
        mpfr_set_d(r33391, a, MPFR_RNDN);
        ;
        mpfr_add(r33393, r33392, r33386, MPFR_RNDN);
        mpfr_mul(r33394, r33393, r33386, MPFR_RNDN);
        mpfr_add(r33395, r33389, r33394, MPFR_RNDN);
        mpfr_div(r33396, r33391, r33395, MPFR_RNDN);
        mpfr_mul(r33397, r33390, r33396, MPFR_RNDN);
        return mpfr_get_d(r33397, MPFR_RNDN);
}

