#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 r27141 = a;
        float r27142 = k;
        float r27143 = m;
        float r27144 = pow(r27142, r27143);
        float r27145 = r27141 * r27144;
        float r27146 = 1;
        float r27147 = 10;
        float r27148 = r27147 * r27142;
        float r27149 = r27146 + r27148;
        float r27150 = r27142 * r27142;
        float r27151 = r27149 + r27150;
        float r27152 = r27145 / r27151;
        return r27152;
}

double f_id(double a, double k, double m) {
        double r27153 = a;
        double r27154 = k;
        double r27155 = m;
        double r27156 = pow(r27154, r27155);
        double r27157 = r27153 * r27156;
        double r27158 = 1;
        double r27159 = 10;
        double r27160 = r27159 * r27154;
        double r27161 = r27158 + r27160;
        double r27162 = r27154 * r27154;
        double r27163 = r27161 + r27162;
        double r27164 = r27157 / r27163;
        return r27164;
}


double f_of(float a, float k, float m) {
        float r27165 = a;
        float r27166 = k;
        float r27167 = 10;
        float r27168 = r27166 + r27167;
        float r27169 = 1;
        float r27170 = fma(r27168, r27166, r27169);
        float r27171 = sqrt(r27170);
        float r27172 = r27165 / r27171;
        float r27173 = m;
        float r27174 = pow(r27166, r27173);
        float r27175 = r27167 + r27166;
        float r27176 = fma(r27175, r27166, r27169);
        float r27177 = sqrt(r27176);
        float r27178 = r27174 / r27177;
        float r27179 = r27172 * r27178;
        return r27179;
}

double f_od(double a, double k, double m) {
        double r27180 = a;
        double r27181 = k;
        double r27182 = 10;
        double r27183 = r27181 + r27182;
        double r27184 = 1;
        double r27185 = fma(r27183, r27181, r27184);
        double r27186 = sqrt(r27185);
        double r27187 = r27180 / r27186;
        double r27188 = m;
        double r27189 = pow(r27181, r27188);
        double r27190 = r27182 + r27181;
        double r27191 = fma(r27190, r27181, r27184);
        double r27192 = sqrt(r27191);
        double r27193 = r27189 / r27192;
        double r27194 = r27187 * r27193;
        return r27194;
}

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 r27195, r27196, r27197, r27198, r27199, r27200, r27201, r27202, r27203, r27204, r27205, r27206;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r27195);
        mpfr_init(r27196);
        mpfr_init(r27197);
        mpfr_init(r27198);
        mpfr_init(r27199);
        mpfr_init_set_str(r27200, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r27201, "10", 10, MPFR_RNDN);
        mpfr_init(r27202);
        mpfr_init(r27203);
        mpfr_init(r27204);
        mpfr_init(r27205);
        mpfr_init(r27206);
}

double f_im(double a, double k, double m) {
        mpfr_set_d(r27195, a, MPFR_RNDN);
        mpfr_set_d(r27196, k, MPFR_RNDN);
        mpfr_set_d(r27197, m, MPFR_RNDN);
        mpfr_pow(r27198, r27196, r27197, MPFR_RNDN);
        mpfr_mul(r27199, r27195, r27198, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r27202, r27201, r27196, MPFR_RNDN);
        mpfr_add(r27203, r27200, r27202, MPFR_RNDN);
        mpfr_mul(r27204, r27196, r27196, MPFR_RNDN);
        mpfr_add(r27205, r27203, r27204, MPFR_RNDN);
        mpfr_div(r27206, r27199, r27205, MPFR_RNDN);
        return mpfr_get_d(r27206, MPFR_RNDN);
}

static mpfr_t r27207, r27208, r27209, r27210, r27211, r27212, r27213, r27214, r27215, r27216, r27217, r27218, r27219, r27220, r27221;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27207);
        mpfr_init(r27208);
        mpfr_init_set_str(r27209, "10", 10, MPFR_RNDN);
        mpfr_init(r27210);
        mpfr_init_set_str(r27211, "1", 10, MPFR_RNDN);
        mpfr_init(r27212);
        mpfr_init(r27213);
        mpfr_init(r27214);
        mpfr_init(r27215);
        mpfr_init(r27216);
        mpfr_init(r27217);
        mpfr_init(r27218);
        mpfr_init(r27219);
        mpfr_init(r27220);
        mpfr_init(r27221);
}

double f_fm(double a, double k, double m) {
        mpfr_set_d(r27207, a, MPFR_RNDN);
        mpfr_set_d(r27208, k, MPFR_RNDN);
        ;
        mpfr_add(r27210, r27208, r27209, MPFR_RNDN);
        ;
        mpfr_fma(r27212, r27210, r27208, r27211, MPFR_RNDN);
        mpfr_sqrt(r27213, r27212, MPFR_RNDN);
        mpfr_div(r27214, r27207, r27213, MPFR_RNDN);
        mpfr_set_d(r27215, m, MPFR_RNDN);
        mpfr_pow(r27216, r27208, r27215, MPFR_RNDN);
        mpfr_add(r27217, r27209, r27208, MPFR_RNDN);
        mpfr_fma(r27218, r27217, r27208, r27211, MPFR_RNDN);
        mpfr_sqrt(r27219, r27218, MPFR_RNDN);
        mpfr_div(r27220, r27216, r27219, MPFR_RNDN);
        mpfr_mul(r27221, r27214, r27220, MPFR_RNDN);
        return mpfr_get_d(r27221, MPFR_RNDN);
}

static mpfr_t r27222, r27223, r27224, r27225, r27226, r27227, r27228, r27229, r27230, r27231, r27232, r27233, r27234, r27235, r27236;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27222);
        mpfr_init(r27223);
        mpfr_init_set_str(r27224, "10", 10, MPFR_RNDN);
        mpfr_init(r27225);
        mpfr_init_set_str(r27226, "1", 10, MPFR_RNDN);
        mpfr_init(r27227);
        mpfr_init(r27228);
        mpfr_init(r27229);
        mpfr_init(r27230);
        mpfr_init(r27231);
        mpfr_init(r27232);
        mpfr_init(r27233);
        mpfr_init(r27234);
        mpfr_init(r27235);
        mpfr_init(r27236);
}

double f_dm(double a, double k, double m) {
        mpfr_set_d(r27222, a, MPFR_RNDN);
        mpfr_set_d(r27223, k, MPFR_RNDN);
        ;
        mpfr_add(r27225, r27223, r27224, MPFR_RNDN);
        ;
        mpfr_fma(r27227, r27225, r27223, r27226, MPFR_RNDN);
        mpfr_sqrt(r27228, r27227, MPFR_RNDN);
        mpfr_div(r27229, r27222, r27228, MPFR_RNDN);
        mpfr_set_d(r27230, m, MPFR_RNDN);
        mpfr_pow(r27231, r27223, r27230, MPFR_RNDN);
        mpfr_add(r27232, r27224, r27223, MPFR_RNDN);
        mpfr_fma(r27233, r27232, r27223, r27226, MPFR_RNDN);
        mpfr_sqrt(r27234, r27233, MPFR_RNDN);
        mpfr_div(r27235, r27231, r27234, MPFR_RNDN);
        mpfr_mul(r27236, r27229, r27235, MPFR_RNDN);
        return mpfr_get_d(r27236, MPFR_RNDN);
}

