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

char *name = "expm1 (example 3.7)";

double f_if(float x) {
        float r4501851 = x;
        float r4501852 = exp(r4501851);
        float r4501853 = 1.0f;
        float r4501854 = r4501852 - r4501853;
        return r4501854;
}

double f_id(double x) {
        double r4501855 = x;
        double r4501856 = exp(r4501855);
        double r4501857 = 1.0;
        double r4501858 = r4501856 - r4501857;
        return r4501858;
}


double f_of(float x) {
        float r4501859 = x;
        float r4501860 = r4501859 * r4501859;
        float r4501861 = 0.16666666666666666f;
        float r4501862 = r4501861 * r4501859;
        float r4501863 = 0.5f;
        float r4501864 = r4501862 + r4501863;
        float r4501865 = r4501860 * r4501864;
        float r4501866 = r4501865 + r4501859;
        return r4501866;
}

double f_od(double x) {
        double r4501867 = x;
        double r4501868 = r4501867 * r4501867;
        double r4501869 = 0.16666666666666666;
        double r4501870 = r4501869 * r4501867;
        double r4501871 = 0.5;
        double r4501872 = r4501870 + r4501871;
        double r4501873 = r4501868 * r4501872;
        double r4501874 = r4501873 + r4501867;
        return r4501874;
}

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 r4501875, r4501876, r4501877, r4501878;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r4501875);
        mpfr_init(r4501876);
        mpfr_init_set_str(r4501877, "1", 10, MPFR_RNDN);
        mpfr_init(r4501878);
}

double f_im(double x) {
        mpfr_set_d(r4501875, x, MPFR_RNDN);
        mpfr_exp(r4501876, r4501875, MPFR_RNDN);
        ;
        mpfr_sub(r4501878, r4501876, r4501877, MPFR_RNDN);
        return mpfr_get_d(r4501878, MPFR_RNDN);
}

static mpfr_t r4501879, r4501880, r4501881, r4501882, r4501883, r4501884, r4501885, r4501886;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r4501879);
        mpfr_init(r4501880);
        mpfr_init_set_str(r4501881, "1/6", 10, MPFR_RNDN);
        mpfr_init(r4501882);
        mpfr_init_set_str(r4501883, "1/2", 10, MPFR_RNDN);
        mpfr_init(r4501884);
        mpfr_init(r4501885);
        mpfr_init(r4501886);
}

double f_fm(double x) {
        mpfr_set_d(r4501879, x, MPFR_RNDN);
        mpfr_sqr(r4501880, r4501879, MPFR_RNDN);
        ;
        mpfr_mul(r4501882, r4501881, r4501879, MPFR_RNDN);
        ;
        mpfr_add(r4501884, r4501882, r4501883, MPFR_RNDN);
        mpfr_mul(r4501885, r4501880, r4501884, MPFR_RNDN);
        mpfr_add(r4501886, r4501885, r4501879, MPFR_RNDN);
        return mpfr_get_d(r4501886, MPFR_RNDN);
}

static mpfr_t r4501887, r4501888, r4501889, r4501890, r4501891, r4501892, r4501893, r4501894;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r4501887);
        mpfr_init(r4501888);
        mpfr_init_set_str(r4501889, "1/6", 10, MPFR_RNDN);
        mpfr_init(r4501890);
        mpfr_init_set_str(r4501891, "1/2", 10, MPFR_RNDN);
        mpfr_init(r4501892);
        mpfr_init(r4501893);
        mpfr_init(r4501894);
}

double f_dm(double x) {
        mpfr_set_d(r4501887, x, MPFR_RNDN);
        mpfr_sqr(r4501888, r4501887, MPFR_RNDN);
        ;
        mpfr_mul(r4501890, r4501889, r4501887, MPFR_RNDN);
        ;
        mpfr_add(r4501892, r4501890, r4501891, MPFR_RNDN);
        mpfr_mul(r4501893, r4501888, r4501892, MPFR_RNDN);
        mpfr_add(r4501894, r4501893, r4501887, MPFR_RNDN);
        return mpfr_get_d(r4501894, MPFR_RNDN);
}

