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

char *name = "math.cos on complex, real part";

double f_if(float re, float im) {
        float r8470 = 0.5f;
        float r8471 = re;
        float r8472 = cos(r8471);
        float r8473 = r8470 * r8472;
        float r8474 = im;
        float r8475 = -r8474;
        float r8476 = exp(r8475);
        float r8477 = exp(r8474);
        float r8478 = r8476 + r8477;
        float r8479 = r8473 * r8478;
        return r8479;
}

double f_id(double re, double im) {
        double r8480 = 0.5;
        double r8481 = re;
        double r8482 = cos(r8481);
        double r8483 = r8480 * r8482;
        double r8484 = im;
        double r8485 = -r8484;
        double r8486 = exp(r8485);
        double r8487 = exp(r8484);
        double r8488 = r8486 + r8487;
        double r8489 = r8483 * r8488;
        return r8489;
}


double f_of(float re, float im) {
        float r8490 = im;
        float r8491 = exp(r8490);
        float r8492 = -r8490;
        float r8493 = exp(r8492);
        float r8494 = r8491 + r8493;
        float r8495 = 0.5f;
        float r8496 = re;
        float r8497 = cos(r8496);
        float r8498 = r8495 * r8497;
        float r8499 = r8494 * r8498;
        return r8499;
}

double f_od(double re, double im) {
        double r8500 = im;
        double r8501 = exp(r8500);
        double r8502 = -r8500;
        double r8503 = exp(r8502);
        double r8504 = r8501 + r8503;
        double r8505 = 0.5;
        double r8506 = re;
        double r8507 = cos(r8506);
        double r8508 = r8505 * r8507;
        double r8509 = r8504 * r8508;
        return r8509;
}

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 r8510, r8511, r8512, r8513, r8514, r8515, r8516, r8517, r8518, r8519;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init_set_str(r8510, "0.5", 10, MPFR_RNDN);
        mpfr_init(r8511);
        mpfr_init(r8512);
        mpfr_init(r8513);
        mpfr_init(r8514);
        mpfr_init(r8515);
        mpfr_init(r8516);
        mpfr_init(r8517);
        mpfr_init(r8518);
        mpfr_init(r8519);
}

double f_im(double re, double im) {
        ;
        mpfr_set_d(r8511, re, MPFR_RNDN);
        mpfr_cos(r8512, r8511, MPFR_RNDN);
        mpfr_mul(r8513, r8510, r8512, MPFR_RNDN);
        mpfr_set_d(r8514, im, MPFR_RNDN);
        mpfr_neg(r8515, r8514, MPFR_RNDN);
        mpfr_exp(r8516, r8515, MPFR_RNDN);
        mpfr_exp(r8517, r8514, MPFR_RNDN);
        mpfr_add(r8518, r8516, r8517, MPFR_RNDN);
        mpfr_mul(r8519, r8513, r8518, MPFR_RNDN);
        return mpfr_get_d(r8519, MPFR_RNDN);
}

static mpfr_t r8520, r8521, r8522, r8523, r8524, r8525, r8526, r8527, r8528, r8529;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8520);
        mpfr_init(r8521);
        mpfr_init(r8522);
        mpfr_init(r8523);
        mpfr_init(r8524);
        mpfr_init_set_str(r8525, "0.5", 10, MPFR_RNDN);
        mpfr_init(r8526);
        mpfr_init(r8527);
        mpfr_init(r8528);
        mpfr_init(r8529);
}

double f_fm(double re, double im) {
        mpfr_set_d(r8520, im, MPFR_RNDN);
        mpfr_exp(r8521, r8520, MPFR_RNDN);
        mpfr_neg(r8522, r8520, MPFR_RNDN);
        mpfr_exp(r8523, r8522, MPFR_RNDN);
        mpfr_add(r8524, r8521, r8523, MPFR_RNDN);
        ;
        mpfr_set_d(r8526, re, MPFR_RNDN);
        mpfr_cos(r8527, r8526, MPFR_RNDN);
        mpfr_mul(r8528, r8525, r8527, MPFR_RNDN);
        mpfr_mul(r8529, r8524, r8528, MPFR_RNDN);
        return mpfr_get_d(r8529, MPFR_RNDN);
}

static mpfr_t r8530, r8531, r8532, r8533, r8534, r8535, r8536, r8537, r8538, r8539;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8530);
        mpfr_init(r8531);
        mpfr_init(r8532);
        mpfr_init(r8533);
        mpfr_init(r8534);
        mpfr_init_set_str(r8535, "0.5", 10, MPFR_RNDN);
        mpfr_init(r8536);
        mpfr_init(r8537);
        mpfr_init(r8538);
        mpfr_init(r8539);
}

double f_dm(double re, double im) {
        mpfr_set_d(r8530, im, MPFR_RNDN);
        mpfr_exp(r8531, r8530, MPFR_RNDN);
        mpfr_neg(r8532, r8530, MPFR_RNDN);
        mpfr_exp(r8533, r8532, MPFR_RNDN);
        mpfr_add(r8534, r8531, r8533, MPFR_RNDN);
        ;
        mpfr_set_d(r8536, re, MPFR_RNDN);
        mpfr_cos(r8537, r8536, MPFR_RNDN);
        mpfr_mul(r8538, r8535, r8537, MPFR_RNDN);
        mpfr_mul(r8539, r8534, r8538, MPFR_RNDN);
        return mpfr_get_d(r8539, MPFR_RNDN);
}

