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

char *name = "Kahan's exp quotient";

double f_if(float x) {
        float r23431 = x;
        float r23432 = exp(r23431);
        float r23433 = 1;
        float r23434 = r23432 - r23433;
        float r23435 = r23434 / r23431;
        return r23435;
}

double f_id(double x) {
        double r23436 = x;
        double r23437 = exp(r23436);
        double r23438 = 1;
        double r23439 = r23437 - r23438;
        double r23440 = r23439 / r23436;
        return r23440;
}


double f_of(float x) {
        float r23441 = x;
        float r23442 = expm1(r23441);
        float r23443 = r23442 / r23441;
        return r23443;
}

double f_od(double x) {
        double r23444 = x;
        double r23445 = expm1(r23444);
        double r23446 = r23445 / r23444;
        return r23446;
}

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 r23447, r23448, r23449, r23450, r23451;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r23447);
        mpfr_init(r23448);
        mpfr_init_set_str(r23449, "1", 10, MPFR_RNDN);
        mpfr_init(r23450);
        mpfr_init(r23451);
}

double f_im(double x) {
        mpfr_set_d(r23447, x, MPFR_RNDN);
        mpfr_exp(r23448, r23447, MPFR_RNDN);
        ;
        mpfr_sub(r23450, r23448, r23449, MPFR_RNDN);
        mpfr_div(r23451, r23450, r23447, MPFR_RNDN);
        return mpfr_get_d(r23451, MPFR_RNDN);
}

static mpfr_t r23452, r23453, r23454;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r23452);
        mpfr_init(r23453);
        mpfr_init(r23454);
}

double f_fm(double x) {
        mpfr_set_d(r23452, x, MPFR_RNDN);
        mpfr_expm1(r23453, r23452, MPFR_RNDN);
        mpfr_div(r23454, r23453, r23452, MPFR_RNDN);
        return mpfr_get_d(r23454, MPFR_RNDN);
}

static mpfr_t r23455, r23456, r23457;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r23455);
        mpfr_init(r23456);
        mpfr_init(r23457);
}

double f_dm(double x) {
        mpfr_set_d(r23455, x, MPFR_RNDN);
        mpfr_expm1(r23456, r23455, MPFR_RNDN);
        mpfr_div(r23457, r23456, r23455, MPFR_RNDN);
        return mpfr_get_d(r23457, MPFR_RNDN);
}

