#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 r18263 = re;
        float r18264 = exp(r18263);
        float r18265 = im;
        float r18266 = sin(r18265);
        float r18267 = r18264 * r18266;
        return r18267;
}

double f_id(double re, double im) {
        double r18268 = re;
        double r18269 = exp(r18268);
        double r18270 = im;
        double r18271 = sin(r18270);
        double r18272 = r18269 * r18271;
        return r18272;
}


double f_of(float re, float im) {
        float r18273 = re;
        float r18274 = exp(r18273);
        float r18275 = im;
        float r18276 = sin(r18275);
        float r18277 = r18274 * r18276;
        return r18277;
}

double f_od(double re, double im) {
        double r18278 = re;
        double r18279 = exp(r18278);
        double r18280 = im;
        double r18281 = sin(r18280);
        double r18282 = r18279 * r18281;
        return r18282;
}

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 r18283, r18284, r18285, r18286, r18287;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r18283);
        mpfr_init(r18284);
        mpfr_init(r18285);
        mpfr_init(r18286);
        mpfr_init(r18287);
}

double f_im(double re, double im) {
        mpfr_set_d(r18283, re, MPFR_RNDN);
        mpfr_exp(r18284, r18283, MPFR_RNDN);
        mpfr_set_d(r18285, im, MPFR_RNDN);
        mpfr_sin(r18286, r18285, MPFR_RNDN);
        mpfr_mul(r18287, r18284, r18286, MPFR_RNDN);
        return mpfr_get_d(r18287, MPFR_RNDN);
}

static mpfr_t r18288, r18289, r18290, r18291, r18292;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r18288);
        mpfr_init(r18289);
        mpfr_init(r18290);
        mpfr_init(r18291);
        mpfr_init(r18292);
}

double f_fm(double re, double im) {
        mpfr_set_d(r18288, re, MPFR_RNDN);
        mpfr_exp(r18289, r18288, MPFR_RNDN);
        mpfr_set_d(r18290, im, MPFR_RNDN);
        mpfr_sin(r18291, r18290, MPFR_RNDN);
        mpfr_mul(r18292, r18289, r18291, MPFR_RNDN);
        return mpfr_get_d(r18292, MPFR_RNDN);
}

static mpfr_t r18293, r18294, r18295, r18296, r18297;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r18293);
        mpfr_init(r18294);
        mpfr_init(r18295);
        mpfr_init(r18296);
        mpfr_init(r18297);
}

double f_dm(double re, double im) {
        mpfr_set_d(r18293, re, MPFR_RNDN);
        mpfr_exp(r18294, r18293, MPFR_RNDN);
        mpfr_set_d(r18295, im, MPFR_RNDN);
        mpfr_sin(r18296, r18295, MPFR_RNDN);
        mpfr_mul(r18297, r18294, r18296, MPFR_RNDN);
        return mpfr_get_d(r18297, MPFR_RNDN);
}

