#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 r27572 = a;
        float r27573 = k;
        float r27574 = m;
        float r27575 = pow(r27573, r27574);
        float r27576 = r27572 * r27575;
        float r27577 = 1;
        float r27578 = 10;
        float r27579 = r27578 * r27573;
        float r27580 = r27577 + r27579;
        float r27581 = r27573 * r27573;
        float r27582 = r27580 + r27581;
        float r27583 = r27576 / r27582;
        return r27583;
}

double f_id(double a, double k, double m) {
        double r27584 = a;
        double r27585 = k;
        double r27586 = m;
        double r27587 = pow(r27585, r27586);
        double r27588 = r27584 * r27587;
        double r27589 = 1;
        double r27590 = 10;
        double r27591 = r27590 * r27585;
        double r27592 = r27589 + r27591;
        double r27593 = r27585 * r27585;
        double r27594 = r27592 + r27593;
        double r27595 = r27588 / r27594;
        return r27595;
}


double f_of(float a, float k, float m) {
        float r27596 = k;
        float r27597 = m;
        float r27598 = pow(r27596, r27597);
        float r27599 = 10;
        float r27600 = r27596 + r27599;
        float r27601 = a;
        float r27602 = r27596 / r27601;
        float r27603 = 1;
        float r27604 = r27603 / r27601;
        float r27605 = fma(r27600, r27602, r27604);
        float r27606 = cbrt(r27605);
        float r27607 = r27606 * r27606;
        float r27608 = r27607 * r27606;
        float r27609 = r27598 / r27608;
        return r27609;
}

double f_od(double a, double k, double m) {
        double r27610 = k;
        double r27611 = m;
        double r27612 = pow(r27610, r27611);
        double r27613 = 10;
        double r27614 = r27610 + r27613;
        double r27615 = a;
        double r27616 = r27610 / r27615;
        double r27617 = 1;
        double r27618 = r27617 / r27615;
        double r27619 = fma(r27614, r27616, r27618);
        double r27620 = cbrt(r27619);
        double r27621 = r27620 * r27620;
        double r27622 = r27621 * r27620;
        double r27623 = r27612 / r27622;
        return r27623;
}

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 r27624, r27625, r27626, r27627, r27628, r27629, r27630, r27631, r27632, r27633, r27634, r27635;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r27624);
        mpfr_init(r27625);
        mpfr_init(r27626);
        mpfr_init(r27627);
        mpfr_init(r27628);
        mpfr_init_set_str(r27629, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r27630, "10", 10, MPFR_RNDN);
        mpfr_init(r27631);
        mpfr_init(r27632);
        mpfr_init(r27633);
        mpfr_init(r27634);
        mpfr_init(r27635);
}

double f_im(double a, double k, double m) {
        mpfr_set_d(r27624, a, MPFR_RNDN);
        mpfr_set_d(r27625, k, MPFR_RNDN);
        mpfr_set_d(r27626, m, MPFR_RNDN);
        mpfr_pow(r27627, r27625, r27626, MPFR_RNDN);
        mpfr_mul(r27628, r27624, r27627, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r27631, r27630, r27625, MPFR_RNDN);
        mpfr_add(r27632, r27629, r27631, MPFR_RNDN);
        mpfr_mul(r27633, r27625, r27625, MPFR_RNDN);
        mpfr_add(r27634, r27632, r27633, MPFR_RNDN);
        mpfr_div(r27635, r27628, r27634, MPFR_RNDN);
        return mpfr_get_d(r27635, MPFR_RNDN);
}

static mpfr_t r27636, r27637, r27638, r27639, r27640, r27641, r27642, r27643, r27644, r27645, r27646, r27647, r27648, r27649;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27636);
        mpfr_init(r27637);
        mpfr_init(r27638);
        mpfr_init_set_str(r27639, "10", 10, MPFR_RNDN);
        mpfr_init(r27640);
        mpfr_init(r27641);
        mpfr_init(r27642);
        mpfr_init_set_str(r27643, "1", 10, MPFR_RNDN);
        mpfr_init(r27644);
        mpfr_init(r27645);
        mpfr_init(r27646);
        mpfr_init(r27647);
        mpfr_init(r27648);
        mpfr_init(r27649);
}

double f_fm(double a, double k, double m) {
        mpfr_set_d(r27636, k, MPFR_RNDN);
        mpfr_set_d(r27637, m, MPFR_RNDN);
        mpfr_pow(r27638, r27636, r27637, MPFR_RNDN);
        ;
        mpfr_add(r27640, r27636, r27639, MPFR_RNDN);
        mpfr_set_d(r27641, a, MPFR_RNDN);
        mpfr_div(r27642, r27636, r27641, MPFR_RNDN);
        ;
        mpfr_div(r27644, r27643, r27641, MPFR_RNDN);
        mpfr_fma(r27645, r27640, r27642, r27644, MPFR_RNDN);
        mpfr_cbrt(r27646, r27645, MPFR_RNDN);
        mpfr_mul(r27647, r27646, r27646, MPFR_RNDN);
        mpfr_mul(r27648, r27647, r27646, MPFR_RNDN);
        mpfr_div(r27649, r27638, r27648, MPFR_RNDN);
        return mpfr_get_d(r27649, MPFR_RNDN);
}

static mpfr_t r27650, r27651, r27652, r27653, r27654, r27655, r27656, r27657, r27658, r27659, r27660, r27661, r27662, r27663;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27650);
        mpfr_init(r27651);
        mpfr_init(r27652);
        mpfr_init_set_str(r27653, "10", 10, MPFR_RNDN);
        mpfr_init(r27654);
        mpfr_init(r27655);
        mpfr_init(r27656);
        mpfr_init_set_str(r27657, "1", 10, MPFR_RNDN);
        mpfr_init(r27658);
        mpfr_init(r27659);
        mpfr_init(r27660);
        mpfr_init(r27661);
        mpfr_init(r27662);
        mpfr_init(r27663);
}

double f_dm(double a, double k, double m) {
        mpfr_set_d(r27650, k, MPFR_RNDN);
        mpfr_set_d(r27651, m, MPFR_RNDN);
        mpfr_pow(r27652, r27650, r27651, MPFR_RNDN);
        ;
        mpfr_add(r27654, r27650, r27653, MPFR_RNDN);
        mpfr_set_d(r27655, a, MPFR_RNDN);
        mpfr_div(r27656, r27650, r27655, MPFR_RNDN);
        ;
        mpfr_div(r27658, r27657, r27655, MPFR_RNDN);
        mpfr_fma(r27659, r27654, r27656, r27658, MPFR_RNDN);
        mpfr_cbrt(r27660, r27659, MPFR_RNDN);
        mpfr_mul(r27661, r27660, r27660, MPFR_RNDN);
        mpfr_mul(r27662, r27661, r27660, MPFR_RNDN);
        mpfr_div(r27663, r27652, r27662, MPFR_RNDN);
        return mpfr_get_d(r27663, MPFR_RNDN);
}

