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

char *name = "math.exp on complex, imaginary part";

double f_if(float re, float im) {
        float r21066 = re;
        float r21067 = exp(r21066);
        float r21068 = im;
        float r21069 = sin(r21068);
        float r21070 = r21067 * r21069;
        return r21070;
}

double f_id(double re, double im) {
        double r21071 = re;
        double r21072 = exp(r21071);
        double r21073 = im;
        double r21074 = sin(r21073);
        double r21075 = r21072 * r21074;
        return r21075;
}


double f_of(float re, float im) {
        float r21076 = re;
        float r21077 = exp(r21076);
        float r21078 = im;
        float r21079 = sin(r21078);
        float r21080 = r21077 * r21079;
        return r21080;
}

double f_od(double re, double im) {
        double r21081 = re;
        double r21082 = exp(r21081);
        double r21083 = im;
        double r21084 = sin(r21083);
        double r21085 = r21082 * r21084;
        return r21085;
}

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 r21086, r21087, r21088, r21089, r21090;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r21086);
        mpfr_init(r21087);
        mpfr_init(r21088);
        mpfr_init(r21089);
        mpfr_init(r21090);
}

double f_im(double re, double im) {
        mpfr_set_d(r21086, re, MPFR_RNDN);
        mpfr_exp(r21087, r21086, MPFR_RNDN);
        mpfr_set_d(r21088, im, MPFR_RNDN);
        mpfr_sin(r21089, r21088, MPFR_RNDN);
        mpfr_mul(r21090, r21087, r21089, MPFR_RNDN);
        return mpfr_get_d(r21090, MPFR_RNDN);
}

static mpfr_t r21091, r21092, r21093, r21094, r21095;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r21091);
        mpfr_init(r21092);
        mpfr_init(r21093);
        mpfr_init(r21094);
        mpfr_init(r21095);
}

double f_fm(double re, double im) {
        mpfr_set_d(r21091, re, MPFR_RNDN);
        mpfr_exp(r21092, r21091, MPFR_RNDN);
        mpfr_set_d(r21093, im, MPFR_RNDN);
        mpfr_sin(r21094, r21093, MPFR_RNDN);
        mpfr_mul(r21095, r21092, r21094, MPFR_RNDN);
        return mpfr_get_d(r21095, MPFR_RNDN);
}

static mpfr_t r21096, r21097, r21098, r21099, r21100;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r21096);
        mpfr_init(r21097);
        mpfr_init(r21098);
        mpfr_init(r21099);
        mpfr_init(r21100);
}

double f_dm(double re, double im) {
        mpfr_set_d(r21096, re, MPFR_RNDN);
        mpfr_exp(r21097, r21096, MPFR_RNDN);
        mpfr_set_d(r21098, im, MPFR_RNDN);
        mpfr_sin(r21099, r21098, MPFR_RNDN);
        mpfr_mul(r21100, r21097, r21099, MPFR_RNDN);
        return mpfr_get_d(r21100, MPFR_RNDN);
}

