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

char *name = "cos2 (problem 3.4.1)";

double f_if(float x) {
        float r7969 = 1.0f;
        float r7970 = x;
        float r7971 = cos(r7970);
        float r7972 = r7969 - r7971;
        float r7973 = r7970 * r7970;
        float r7974 = r7972 / r7973;
        return r7974;
}

double f_id(double x) {
        double r7975 = 1.0;
        double r7976 = x;
        double r7977 = cos(r7976);
        double r7978 = r7975 - r7977;
        double r7979 = r7976 * r7976;
        double r7980 = r7978 / r7979;
        return r7980;
}


double f_of(float x) {
        float r7981 = x;
        float r7982 = -0.030793827110981598f;
        bool r7983 = r7981 <= r7982;
        float r7984 = 1.0f;
        float r7985 = cos(r7981);
        float r7986 = r7984 - r7985;
        float r7987 = sqrt(r7986);
        float r7988 = r7987 / r7981;
        float r7989 = r7988 * r7988;
        float r7990 = 0.0341610798052422f;
        bool r7991 = r7981 <= r7990;
        float r7992 = 0.001388888888888889f;
        float r7993 = 4.0f;
        float r7994 = pow(r7981, r7993);
        float r7995 = 0.5f;
        float r7996 = fma(r7992, r7994, r7995);
        float r7997 = r7981 * r7981;
        float r7998 = 0.041666666666666664f;
        float r7999 = r7997 * r7998;
        float r8000 = r7996 - r7999;
        float r8001 = r7984 / r7997;
        float r8002 = r7985 / r7997;
        float r8003 = r8001 - r8002;
        float r8004 = r7991 ? r8000 : r8003;
        float r8005 = r7983 ? r7989 : r8004;
        return r8005;
}

double f_od(double x) {
        double r8006 = x;
        double r8007 = -0.030793827110981598;
        bool r8008 = r8006 <= r8007;
        double r8009 = 1.0;
        double r8010 = cos(r8006);
        double r8011 = r8009 - r8010;
        double r8012 = sqrt(r8011);
        double r8013 = r8012 / r8006;
        double r8014 = r8013 * r8013;
        double r8015 = 0.0341610798052422;
        bool r8016 = r8006 <= r8015;
        double r8017 = 0.001388888888888889;
        double r8018 = 4.0;
        double r8019 = pow(r8006, r8018);
        double r8020 = 0.5;
        double r8021 = fma(r8017, r8019, r8020);
        double r8022 = r8006 * r8006;
        double r8023 = 0.041666666666666664;
        double r8024 = r8022 * r8023;
        double r8025 = r8021 - r8024;
        double r8026 = r8009 / r8022;
        double r8027 = r8010 / r8022;
        double r8028 = r8026 - r8027;
        double r8029 = r8016 ? r8025 : r8028;
        double r8030 = r8008 ? r8014 : r8029;
        return r8030;
}

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 r8031, r8032, r8033, r8034, r8035, r8036;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2384);
        mpfr_init_set_str(r8031, "1", 10, MPFR_RNDN);
        mpfr_init(r8032);
        mpfr_init(r8033);
        mpfr_init(r8034);
        mpfr_init(r8035);
        mpfr_init(r8036);
}

double f_im(double x) {
        ;
        mpfr_set_d(r8032, x, MPFR_RNDN);
        mpfr_cos(r8033, r8032, MPFR_RNDN);
        mpfr_sub(r8034, r8031, r8033, MPFR_RNDN);
        mpfr_mul(r8035, r8032, r8032, MPFR_RNDN);
        mpfr_div(r8036, r8034, r8035, MPFR_RNDN);
        return mpfr_get_d(r8036, MPFR_RNDN);
}

static mpfr_t r8037, r8038, r8039, r8040, r8041, r8042, r8043, r8044, r8045, r8046, r8047, r8048, r8049, r8050, r8051, r8052, r8053, r8054, r8055, r8056, r8057, r8058, r8059, r8060, r8061;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2384);
        mpfr_init(r8037);
        mpfr_init_set_str(r8038, "-0.030793827110981598", 10, MPFR_RNDN);
        mpfr_init(r8039);
        mpfr_init_set_str(r8040, "1", 10, MPFR_RNDN);
        mpfr_init(r8041);
        mpfr_init(r8042);
        mpfr_init(r8043);
        mpfr_init(r8044);
        mpfr_init(r8045);
        mpfr_init_set_str(r8046, "0.0341610798052422", 10, MPFR_RNDN);
        mpfr_init(r8047);
        mpfr_init_set_str(r8048, "1/720", 10, MPFR_RNDN);
        mpfr_init_set_str(r8049, "4", 10, MPFR_RNDN);
        mpfr_init(r8050);
        mpfr_init_set_str(r8051, "1/2", 10, MPFR_RNDN);
        mpfr_init(r8052);
        mpfr_init(r8053);
        mpfr_init_set_str(r8054, "1/24", 10, MPFR_RNDN);
        mpfr_init(r8055);
        mpfr_init(r8056);
        mpfr_init(r8057);
        mpfr_init(r8058);
        mpfr_init(r8059);
        mpfr_init(r8060);
        mpfr_init(r8061);
}

double f_fm(double x) {
        mpfr_set_d(r8037, x, MPFR_RNDN);
        ;
        mpfr_set_si(r8039, mpfr_cmp(r8037, r8038) <= 0, MPFR_RNDN);
        ;
        mpfr_cos(r8041, r8037, MPFR_RNDN);
        mpfr_sub(r8042, r8040, r8041, MPFR_RNDN);
        mpfr_sqrt(r8043, r8042, MPFR_RNDN);
        mpfr_div(r8044, r8043, r8037, MPFR_RNDN);
        mpfr_mul(r8045, r8044, r8044, MPFR_RNDN);
        ;
        mpfr_set_si(r8047, mpfr_cmp(r8037, r8046) <= 0, MPFR_RNDN);
        ;
        ;
        mpfr_pow(r8050, r8037, r8049, MPFR_RNDN);
        ;
        mpfr_fma(r8052, r8048, r8050, r8051, MPFR_RNDN);
        mpfr_mul(r8053, r8037, r8037, MPFR_RNDN);
        ;
        mpfr_mul(r8055, r8053, r8054, MPFR_RNDN);
        mpfr_sub(r8056, r8052, r8055, MPFR_RNDN);
        mpfr_div(r8057, r8040, r8053, MPFR_RNDN);
        mpfr_div(r8058, r8041, r8053, MPFR_RNDN);
        mpfr_sub(r8059, r8057, r8058, MPFR_RNDN);
        if (mpfr_get_si(r8047, MPFR_RNDN)) { mpfr_set(r8060, r8056, MPFR_RNDN); } else { mpfr_set(r8060, r8059, MPFR_RNDN); };
        if (mpfr_get_si(r8039, MPFR_RNDN)) { mpfr_set(r8061, r8045, MPFR_RNDN); } else { mpfr_set(r8061, r8060, MPFR_RNDN); };
        return mpfr_get_d(r8061, MPFR_RNDN);
}

static mpfr_t r8062, r8063, r8064, r8065, r8066, r8067, r8068, r8069, r8070, r8071, r8072, r8073, r8074, r8075, r8076, r8077, r8078, r8079, r8080, r8081, r8082, r8083, r8084, r8085, r8086;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2384);
        mpfr_init(r8062);
        mpfr_init_set_str(r8063, "-0.030793827110981598", 10, MPFR_RNDN);
        mpfr_init(r8064);
        mpfr_init_set_str(r8065, "1", 10, MPFR_RNDN);
        mpfr_init(r8066);
        mpfr_init(r8067);
        mpfr_init(r8068);
        mpfr_init(r8069);
        mpfr_init(r8070);
        mpfr_init_set_str(r8071, "0.0341610798052422", 10, MPFR_RNDN);
        mpfr_init(r8072);
        mpfr_init_set_str(r8073, "1/720", 10, MPFR_RNDN);
        mpfr_init_set_str(r8074, "4", 10, MPFR_RNDN);
        mpfr_init(r8075);
        mpfr_init_set_str(r8076, "1/2", 10, MPFR_RNDN);
        mpfr_init(r8077);
        mpfr_init(r8078);
        mpfr_init_set_str(r8079, "1/24", 10, MPFR_RNDN);
        mpfr_init(r8080);
        mpfr_init(r8081);
        mpfr_init(r8082);
        mpfr_init(r8083);
        mpfr_init(r8084);
        mpfr_init(r8085);
        mpfr_init(r8086);
}

double f_dm(double x) {
        mpfr_set_d(r8062, x, MPFR_RNDN);
        ;
        mpfr_set_si(r8064, mpfr_cmp(r8062, r8063) <= 0, MPFR_RNDN);
        ;
        mpfr_cos(r8066, r8062, MPFR_RNDN);
        mpfr_sub(r8067, r8065, r8066, MPFR_RNDN);
        mpfr_sqrt(r8068, r8067, MPFR_RNDN);
        mpfr_div(r8069, r8068, r8062, MPFR_RNDN);
        mpfr_mul(r8070, r8069, r8069, MPFR_RNDN);
        ;
        mpfr_set_si(r8072, mpfr_cmp(r8062, r8071) <= 0, MPFR_RNDN);
        ;
        ;
        mpfr_pow(r8075, r8062, r8074, MPFR_RNDN);
        ;
        mpfr_fma(r8077, r8073, r8075, r8076, MPFR_RNDN);
        mpfr_mul(r8078, r8062, r8062, MPFR_RNDN);
        ;
        mpfr_mul(r8080, r8078, r8079, MPFR_RNDN);
        mpfr_sub(r8081, r8077, r8080, MPFR_RNDN);
        mpfr_div(r8082, r8065, r8078, MPFR_RNDN);
        mpfr_div(r8083, r8066, r8078, MPFR_RNDN);
        mpfr_sub(r8084, r8082, r8083, MPFR_RNDN);
        if (mpfr_get_si(r8072, MPFR_RNDN)) { mpfr_set(r8085, r8081, MPFR_RNDN); } else { mpfr_set(r8085, r8084, MPFR_RNDN); };
        if (mpfr_get_si(r8064, MPFR_RNDN)) { mpfr_set(r8086, r8070, MPFR_RNDN); } else { mpfr_set(r8086, r8085, MPFR_RNDN); };
        return mpfr_get_d(r8086, MPFR_RNDN);
}

