#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 r27001 = x;
        float r27002 = y;
        float r27003 = z;
        float r27004 = r27002 + r27003;
        float r27005 = tan(r27004);
        float r27006 = a;
        float r27007 = tan(r27006);
        float r27008 = r27005 - r27007;
        float r27009 = r27001 + r27008;
        return r27009;
}

double f_id(double x, double y, double z, double a) {
        double r27010 = x;
        double r27011 = y;
        double r27012 = z;
        double r27013 = r27011 + r27012;
        double r27014 = tan(r27013);
        double r27015 = a;
        double r27016 = tan(r27015);
        double r27017 = r27014 - r27016;
        double r27018 = r27010 + r27017;
        return r27018;
}


double f_of(float x, float y, float z, float a) {
        float r27019 = x;
        float r27020 = z;
        float r27021 = tan(r27020);
        float r27022 = y;
        float r27023 = tan(r27022);
        float r27024 = r27021 * r27023;
        float r27025 = r27023 + r27021;
        float r27026 = fma(r27024, r27025, r27025);
        float r27027 = 1;
        float r27028 = sin(r27020);
        float r27029 = sin(r27022);
        float r27030 = r27028 * r27029;
        float r27031 = r27021 * r27029;
        float r27032 = r27030 * r27031;
        float r27033 = cos(r27020);
        float r27034 = cos(r27022);
        float r27035 = r27033 * r27034;
        float r27036 = r27035 * r27034;
        float r27037 = r27032 / r27036;
        float r27038 = r27027 - r27037;
        float r27039 = r27026 / r27038;
        float r27040 = a;
        float r27041 = tan(r27040);
        float r27042 = r27039 - r27041;
        float r27043 = 0;
        float r27044 = r27042 + r27043;
        float r27045 = r27019 + r27044;
        return r27045;
}

double f_od(double x, double y, double z, double a) {
        double r27046 = x;
        double r27047 = z;
        double r27048 = tan(r27047);
        double r27049 = y;
        double r27050 = tan(r27049);
        double r27051 = r27048 * r27050;
        double r27052 = r27050 + r27048;
        double r27053 = fma(r27051, r27052, r27052);
        double r27054 = 1;
        double r27055 = sin(r27047);
        double r27056 = sin(r27049);
        double r27057 = r27055 * r27056;
        double r27058 = r27048 * r27056;
        double r27059 = r27057 * r27058;
        double r27060 = cos(r27047);
        double r27061 = cos(r27049);
        double r27062 = r27060 * r27061;
        double r27063 = r27062 * r27061;
        double r27064 = r27059 / r27063;
        double r27065 = r27054 - r27064;
        double r27066 = r27053 / r27065;
        double r27067 = a;
        double r27068 = tan(r27067);
        double r27069 = r27066 - r27068;
        double r27070 = 0;
        double r27071 = r27069 + r27070;
        double r27072 = r27046 + r27071;
        return r27072;
}

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 r27073, r27074, r27075, r27076, r27077, r27078, r27079, r27080, r27081;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r27073);
        mpfr_init(r27074);
        mpfr_init(r27075);
        mpfr_init(r27076);
        mpfr_init(r27077);
        mpfr_init(r27078);
        mpfr_init(r27079);
        mpfr_init(r27080);
        mpfr_init(r27081);
}

double f_im(double x, double y, double z, double a) {
        mpfr_set_d(r27073, x, MPFR_RNDN);
        mpfr_set_d(r27074, y, MPFR_RNDN);
        mpfr_set_d(r27075, z, MPFR_RNDN);
        mpfr_add(r27076, r27074, r27075, MPFR_RNDN);
        mpfr_tan(r27077, r27076, MPFR_RNDN);
        mpfr_set_d(r27078, a, MPFR_RNDN);
        mpfr_tan(r27079, r27078, MPFR_RNDN);
        mpfr_sub(r27080, r27077, r27079, MPFR_RNDN);
        mpfr_add(r27081, r27073, r27080, MPFR_RNDN);
        return mpfr_get_d(r27081, MPFR_RNDN);
}

static mpfr_t r27082, r27083, r27084, r27085, r27086, r27087, r27088, r27089, r27090, r27091, r27092, r27093, r27094, r27095, r27096, r27097, r27098, r27099, r27100, r27101, r27102, r27103, r27104, r27105, r27106, r27107, r27108;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r27082);
        mpfr_init(r27083);
        mpfr_init(r27084);
        mpfr_init(r27085);
        mpfr_init(r27086);
        mpfr_init(r27087);
        mpfr_init(r27088);
        mpfr_init(r27089);
        mpfr_init_set_str(r27090, "1", 10, MPFR_RNDN);
        mpfr_init(r27091);
        mpfr_init(r27092);
        mpfr_init(r27093);
        mpfr_init(r27094);
        mpfr_init(r27095);
        mpfr_init(r27096);
        mpfr_init(r27097);
        mpfr_init(r27098);
        mpfr_init(r27099);
        mpfr_init(r27100);
        mpfr_init(r27101);
        mpfr_init(r27102);
        mpfr_init(r27103);
        mpfr_init(r27104);
        mpfr_init(r27105);
        mpfr_init_set_str(r27106, "0", 10, MPFR_RNDN);
        mpfr_init(r27107);
        mpfr_init(r27108);
}

double f_fm(double x, double y, double z, double a) {
        mpfr_set_d(r27082, x, MPFR_RNDN);
        mpfr_set_d(r27083, z, MPFR_RNDN);
        mpfr_tan(r27084, r27083, MPFR_RNDN);
        mpfr_set_d(r27085, y, MPFR_RNDN);
        mpfr_tan(r27086, r27085, MPFR_RNDN);
        mpfr_mul(r27087, r27084, r27086, MPFR_RNDN);
        mpfr_add(r27088, r27086, r27084, MPFR_RNDN);
        mpfr_fma(r27089, r27087, r27088, r27088, MPFR_RNDN);
        ;
        mpfr_sin(r27091, r27083, MPFR_RNDN);
        mpfr_sin(r27092, r27085, MPFR_RNDN);
        mpfr_mul(r27093, r27091, r27092, MPFR_RNDN);
        mpfr_mul(r27094, r27084, r27092, MPFR_RNDN);
        mpfr_mul(r27095, r27093, r27094, MPFR_RNDN);
        mpfr_cos(r27096, r27083, MPFR_RNDN);
        mpfr_cos(r27097, r27085, MPFR_RNDN);
        mpfr_mul(r27098, r27096, r27097, MPFR_RNDN);
        mpfr_mul(r27099, r27098, r27097, MPFR_RNDN);
        mpfr_div(r27100, r27095, r27099, MPFR_RNDN);
        mpfr_sub(r27101, r27090, r27100, MPFR_RNDN);
        mpfr_div(r27102, r27089, r27101, MPFR_RNDN);
        mpfr_set_d(r27103, a, MPFR_RNDN);
        mpfr_tan(r27104, r27103, MPFR_RNDN);
        mpfr_sub(r27105, r27102, r27104, MPFR_RNDN);
        ;
        mpfr_add(r27107, r27105, r27106, MPFR_RNDN);
        mpfr_add(r27108, r27082, r27107, MPFR_RNDN);
        return mpfr_get_d(r27108, MPFR_RNDN);
}

static mpfr_t r27109, r27110, r27111, r27112, r27113, r27114, r27115, r27116, r27117, r27118, r27119, r27120, r27121, r27122, r27123, r27124, r27125, r27126, r27127, r27128, r27129, r27130, r27131, r27132, r27133, r27134, r27135;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r27109);
        mpfr_init(r27110);
        mpfr_init(r27111);
        mpfr_init(r27112);
        mpfr_init(r27113);
        mpfr_init(r27114);
        mpfr_init(r27115);
        mpfr_init(r27116);
        mpfr_init_set_str(r27117, "1", 10, MPFR_RNDN);
        mpfr_init(r27118);
        mpfr_init(r27119);
        mpfr_init(r27120);
        mpfr_init(r27121);
        mpfr_init(r27122);
        mpfr_init(r27123);
        mpfr_init(r27124);
        mpfr_init(r27125);
        mpfr_init(r27126);
        mpfr_init(r27127);
        mpfr_init(r27128);
        mpfr_init(r27129);
        mpfr_init(r27130);
        mpfr_init(r27131);
        mpfr_init(r27132);
        mpfr_init_set_str(r27133, "0", 10, MPFR_RNDN);
        mpfr_init(r27134);
        mpfr_init(r27135);
}

double f_dm(double x, double y, double z, double a) {
        mpfr_set_d(r27109, x, MPFR_RNDN);
        mpfr_set_d(r27110, z, MPFR_RNDN);
        mpfr_tan(r27111, r27110, MPFR_RNDN);
        mpfr_set_d(r27112, y, MPFR_RNDN);
        mpfr_tan(r27113, r27112, MPFR_RNDN);
        mpfr_mul(r27114, r27111, r27113, MPFR_RNDN);
        mpfr_add(r27115, r27113, r27111, MPFR_RNDN);
        mpfr_fma(r27116, r27114, r27115, r27115, MPFR_RNDN);
        ;
        mpfr_sin(r27118, r27110, MPFR_RNDN);
        mpfr_sin(r27119, r27112, MPFR_RNDN);
        mpfr_mul(r27120, r27118, r27119, MPFR_RNDN);
        mpfr_mul(r27121, r27111, r27119, MPFR_RNDN);
        mpfr_mul(r27122, r27120, r27121, MPFR_RNDN);
        mpfr_cos(r27123, r27110, MPFR_RNDN);
        mpfr_cos(r27124, r27112, MPFR_RNDN);
        mpfr_mul(r27125, r27123, r27124, MPFR_RNDN);
        mpfr_mul(r27126, r27125, r27124, MPFR_RNDN);
        mpfr_div(r27127, r27122, r27126, MPFR_RNDN);
        mpfr_sub(r27128, r27117, r27127, MPFR_RNDN);
        mpfr_div(r27129, r27116, r27128, MPFR_RNDN);
        mpfr_set_d(r27130, a, MPFR_RNDN);
        mpfr_tan(r27131, r27130, MPFR_RNDN);
        mpfr_sub(r27132, r27129, r27131, MPFR_RNDN);
        ;
        mpfr_add(r27134, r27132, r27133, MPFR_RNDN);
        mpfr_add(r27135, r27109, r27134, MPFR_RNDN);
        return mpfr_get_d(r27135, MPFR_RNDN);
}

