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

char *name = "(+ x (- (tan (+ y z)) (tan a)))";

double f_if(float x, float y, float z, float a) {
        float r27590 = x;
        float r27591 = y;
        float r27592 = z;
        float r27593 = r27591 + r27592;
        float r27594 = tan(r27593);
        float r27595 = a;
        float r27596 = tan(r27595);
        float r27597 = r27594 - r27596;
        float r27598 = r27590 + r27597;
        return r27598;
}

double f_id(double x, double y, double z, double a) {
        double r27599 = x;
        double r27600 = y;
        double r27601 = z;
        double r27602 = r27600 + r27601;
        double r27603 = tan(r27602);
        double r27604 = a;
        double r27605 = tan(r27604);
        double r27606 = r27603 - r27605;
        double r27607 = r27599 + r27606;
        return r27607;
}


double f_of(float x, float y, float z, float a) {
        float r27608 = x;
        float r27609 = z;
        float r27610 = tan(r27609);
        float r27611 = y;
        float r27612 = tan(r27611);
        float r27613 = r27610 + r27612;
        float r27614 = 1;
        float r27615 = r27610 * r27612;
        float r27616 = r27614 - r27615;
        float r27617 = r27613 / r27616;
        float r27618 = a;
        float r27619 = tan(r27618);
        float r27620 = r27617 - r27619;
        float r27621 = exp(r27620);
        float r27622 = log(r27621);
        float r27623 = r27608 + r27622;
        return r27623;
}

double f_od(double x, double y, double z, double a) {
        double r27624 = x;
        double r27625 = z;
        double r27626 = tan(r27625);
        double r27627 = y;
        double r27628 = tan(r27627);
        double r27629 = r27626 + r27628;
        double r27630 = 1;
        double r27631 = r27626 * r27628;
        double r27632 = r27630 - r27631;
        double r27633 = r27629 / r27632;
        double r27634 = a;
        double r27635 = tan(r27634);
        double r27636 = r27633 - r27635;
        double r27637 = exp(r27636);
        double r27638 = log(r27637);
        double r27639 = r27624 + r27638;
        return r27639;
}

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 r27640, r27641, r27642, r27643, r27644, r27645, r27646, r27647, r27648;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r27640);
        mpfr_init(r27641);
        mpfr_init(r27642);
        mpfr_init(r27643);
        mpfr_init(r27644);
        mpfr_init(r27645);
        mpfr_init(r27646);
        mpfr_init(r27647);
        mpfr_init(r27648);
}

double f_im(double x, double y, double z, double a) {
        mpfr_set_d(r27640, x, MPFR_RNDN);
        mpfr_set_d(r27641, y, MPFR_RNDN);
        mpfr_set_d(r27642, z, MPFR_RNDN);
        mpfr_add(r27643, r27641, r27642, MPFR_RNDN);
        mpfr_tan(r27644, r27643, MPFR_RNDN);
        mpfr_set_d(r27645, a, MPFR_RNDN);
        mpfr_tan(r27646, r27645, MPFR_RNDN);
        mpfr_sub(r27647, r27644, r27646, MPFR_RNDN);
        mpfr_add(r27648, r27640, r27647, MPFR_RNDN);
        return mpfr_get_d(r27648, MPFR_RNDN);
}

static mpfr_t r27649, r27650, r27651, r27652, r27653, r27654, r27655, r27656, r27657, r27658, r27659, r27660, r27661, r27662, r27663, r27664;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r27649);
        mpfr_init(r27650);
        mpfr_init(r27651);
        mpfr_init(r27652);
        mpfr_init(r27653);
        mpfr_init(r27654);
        mpfr_init_set_str(r27655, "1", 10, MPFR_RNDN);
        mpfr_init(r27656);
        mpfr_init(r27657);
        mpfr_init(r27658);
        mpfr_init(r27659);
        mpfr_init(r27660);
        mpfr_init(r27661);
        mpfr_init(r27662);
        mpfr_init(r27663);
        mpfr_init(r27664);
}

double f_fm(double x, double y, double z, double a) {
        mpfr_set_d(r27649, x, MPFR_RNDN);
        mpfr_set_d(r27650, z, MPFR_RNDN);
        mpfr_tan(r27651, r27650, MPFR_RNDN);
        mpfr_set_d(r27652, y, MPFR_RNDN);
        mpfr_tan(r27653, r27652, MPFR_RNDN);
        mpfr_add(r27654, r27651, r27653, MPFR_RNDN);
        ;
        mpfr_mul(r27656, r27651, r27653, MPFR_RNDN);
        mpfr_sub(r27657, r27655, r27656, MPFR_RNDN);
        mpfr_div(r27658, r27654, r27657, MPFR_RNDN);
        mpfr_set_d(r27659, a, MPFR_RNDN);
        mpfr_tan(r27660, r27659, MPFR_RNDN);
        mpfr_sub(r27661, r27658, r27660, MPFR_RNDN);
        mpfr_exp(r27662, r27661, MPFR_RNDN);
        mpfr_log(r27663, r27662, MPFR_RNDN);
        mpfr_add(r27664, r27649, r27663, MPFR_RNDN);
        return mpfr_get_d(r27664, MPFR_RNDN);
}

static mpfr_t r27665, r27666, r27667, r27668, r27669, r27670, r27671, r27672, r27673, r27674, r27675, r27676, r27677, r27678, r27679, r27680;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r27665);
        mpfr_init(r27666);
        mpfr_init(r27667);
        mpfr_init(r27668);
        mpfr_init(r27669);
        mpfr_init(r27670);
        mpfr_init_set_str(r27671, "1", 10, MPFR_RNDN);
        mpfr_init(r27672);
        mpfr_init(r27673);
        mpfr_init(r27674);
        mpfr_init(r27675);
        mpfr_init(r27676);
        mpfr_init(r27677);
        mpfr_init(r27678);
        mpfr_init(r27679);
        mpfr_init(r27680);
}

double f_dm(double x, double y, double z, double a) {
        mpfr_set_d(r27665, x, MPFR_RNDN);
        mpfr_set_d(r27666, z, MPFR_RNDN);
        mpfr_tan(r27667, r27666, MPFR_RNDN);
        mpfr_set_d(r27668, y, MPFR_RNDN);
        mpfr_tan(r27669, r27668, MPFR_RNDN);
        mpfr_add(r27670, r27667, r27669, MPFR_RNDN);
        ;
        mpfr_mul(r27672, r27667, r27669, MPFR_RNDN);
        mpfr_sub(r27673, r27671, r27672, MPFR_RNDN);
        mpfr_div(r27674, r27670, r27673, MPFR_RNDN);
        mpfr_set_d(r27675, a, MPFR_RNDN);
        mpfr_tan(r27676, r27675, MPFR_RNDN);
        mpfr_sub(r27677, r27674, r27676, MPFR_RNDN);
        mpfr_exp(r27678, r27677, MPFR_RNDN);
        mpfr_log(r27679, r27678, MPFR_RNDN);
        mpfr_add(r27680, r27665, r27679, MPFR_RNDN);
        return mpfr_get_d(r27680, MPFR_RNDN);
}

