#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 r25863 = x;
        float r25864 = exp(r25863);
        float r25865 = 1;
        float r25866 = r25864 - r25865;
        float r25867 = r25866 / r25863;
        return r25867;
}

double f_id(double x) {
        double r25868 = x;
        double r25869 = exp(r25868);
        double r25870 = 1;
        double r25871 = r25869 - r25870;
        double r25872 = r25871 / r25868;
        return r25872;
}


double f_of(float x) {
        float r25873 = x;
        float r25874 = -0.0002001703686491939;
        bool r25875 = r25873 <= r25874;
        float r25876 = exp(r25873);
        float r25877 = r25876 / r25873;
        float r25878 = 1;
        float r25879 = r25878 / r25873;
        float r25880 = r25877 - r25879;
        float r25881 = 1/6;
        float r25882 = 2;
        float r25883 = pow(r25873, r25882);
        float r25884 = r25881 * r25883;
        float r25885 = 1/2;
        float r25886 = r25885 * r25873;
        float r25887 = r25878 + r25886;
        float r25888 = r25884 + r25887;
        float r25889 = r25875 ? r25880 : r25888;
        return r25889;
}

double f_od(double x) {
        double r25890 = x;
        double r25891 = -0.0002001703686491939;
        bool r25892 = r25890 <= r25891;
        double r25893 = exp(r25890);
        double r25894 = r25893 / r25890;
        double r25895 = 1;
        double r25896 = r25895 / r25890;
        double r25897 = r25894 - r25896;
        double r25898 = 1/6;
        double r25899 = 2;
        double r25900 = pow(r25890, r25899);
        double r25901 = r25898 * r25900;
        double r25902 = 1/2;
        double r25903 = r25902 * r25890;
        double r25904 = r25895 + r25903;
        double r25905 = r25901 + r25904;
        double r25906 = r25892 ? r25897 : r25905;
        return r25906;
}

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 r25907, r25908, r25909, r25910, r25911;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r25907);
        mpfr_init(r25908);
        mpfr_init_set_str(r25909, "1", 10, MPFR_RNDN);
        mpfr_init(r25910);
        mpfr_init(r25911);
}

double f_im(double x) {
        mpfr_set_d(r25907, x, MPFR_RNDN);
        mpfr_exp(r25908, r25907, MPFR_RNDN);
        ;
        mpfr_sub(r25910, r25908, r25909, MPFR_RNDN);
        mpfr_div(r25911, r25910, r25907, MPFR_RNDN);
        return mpfr_get_d(r25911, MPFR_RNDN);
}

static mpfr_t r25912, r25913, r25914, r25915, r25916, r25917, r25918, r25919, r25920, r25921, r25922, r25923, r25924, r25925, r25926, r25927, r25928;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r25912);
        mpfr_init_set_str(r25913, "-0.0002001703686491939", 10, MPFR_RNDN);
        mpfr_init(r25914);
        mpfr_init(r25915);
        mpfr_init(r25916);
        mpfr_init_set_str(r25917, "1", 10, MPFR_RNDN);
        mpfr_init(r25918);
        mpfr_init(r25919);
        mpfr_init_set_str(r25920, "1/6", 10, MPFR_RNDN);
        mpfr_init_set_str(r25921, "2", 10, MPFR_RNDN);
        mpfr_init(r25922);
        mpfr_init(r25923);
        mpfr_init_set_str(r25924, "1/2", 10, MPFR_RNDN);
        mpfr_init(r25925);
        mpfr_init(r25926);
        mpfr_init(r25927);
        mpfr_init(r25928);
}

double f_fm(double x) {
        mpfr_set_d(r25912, x, MPFR_RNDN);
        ;
        mpfr_set_si(r25914, mpfr_cmp(r25912, r25913) <= 0, MPFR_RNDN);
        mpfr_exp(r25915, r25912, MPFR_RNDN);
        mpfr_div(r25916, r25915, r25912, MPFR_RNDN);
        ;
        mpfr_div(r25918, r25917, r25912, MPFR_RNDN);
        mpfr_sub(r25919, r25916, r25918, MPFR_RNDN);
        ;
        ;
        mpfr_pow(r25922, r25912, r25921, MPFR_RNDN);
        mpfr_mul(r25923, r25920, r25922, MPFR_RNDN);
        ;
        mpfr_mul(r25925, r25924, r25912, MPFR_RNDN);
        mpfr_add(r25926, r25917, r25925, MPFR_RNDN);
        mpfr_add(r25927, r25923, r25926, MPFR_RNDN);
        if (mpfr_get_si(r25914, MPFR_RNDN)) { mpfr_set(r25928, r25919, MPFR_RNDN); } else { mpfr_set(r25928, r25927, MPFR_RNDN); };
        return mpfr_get_d(r25928, MPFR_RNDN);
}

static mpfr_t r25929, r25930, r25931, r25932, r25933, r25934, r25935, r25936, r25937, r25938, r25939, r25940, r25941, r25942, r25943, r25944, r25945;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r25929);
        mpfr_init_set_str(r25930, "-0.0002001703686491939", 10, MPFR_RNDN);
        mpfr_init(r25931);
        mpfr_init(r25932);
        mpfr_init(r25933);
        mpfr_init_set_str(r25934, "1", 10, MPFR_RNDN);
        mpfr_init(r25935);
        mpfr_init(r25936);
        mpfr_init_set_str(r25937, "1/6", 10, MPFR_RNDN);
        mpfr_init_set_str(r25938, "2", 10, MPFR_RNDN);
        mpfr_init(r25939);
        mpfr_init(r25940);
        mpfr_init_set_str(r25941, "1/2", 10, MPFR_RNDN);
        mpfr_init(r25942);
        mpfr_init(r25943);
        mpfr_init(r25944);
        mpfr_init(r25945);
}

double f_dm(double x) {
        mpfr_set_d(r25929, x, MPFR_RNDN);
        ;
        mpfr_set_si(r25931, mpfr_cmp(r25929, r25930) <= 0, MPFR_RNDN);
        mpfr_exp(r25932, r25929, MPFR_RNDN);
        mpfr_div(r25933, r25932, r25929, MPFR_RNDN);
        ;
        mpfr_div(r25935, r25934, r25929, MPFR_RNDN);
        mpfr_sub(r25936, r25933, r25935, MPFR_RNDN);
        ;
        ;
        mpfr_pow(r25939, r25929, r25938, MPFR_RNDN);
        mpfr_mul(r25940, r25937, r25939, MPFR_RNDN);
        ;
        mpfr_mul(r25942, r25941, r25929, MPFR_RNDN);
        mpfr_add(r25943, r25934, r25942, MPFR_RNDN);
        mpfr_add(r25944, r25940, r25943, MPFR_RNDN);
        if (mpfr_get_si(r25931, MPFR_RNDN)) { mpfr_set(r25945, r25936, MPFR_RNDN); } else { mpfr_set(r25945, r25944, MPFR_RNDN); };
        return mpfr_get_d(r25945, MPFR_RNDN);
}

