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

char *name = "Exp of sum of logs";

double f_if(float a, float b) {
        float r25122 = a;
        float r25123 = log(r25122);
        float r25124 = b;
        float r25125 = log(r25124);
        float r25126 = r25123 + r25125;
        float r25127 = exp(r25126);
        return r25127;
}

double f_id(double a, double b) {
        double r25128 = a;
        double r25129 = log(r25128);
        double r25130 = b;
        double r25131 = log(r25130);
        double r25132 = r25129 + r25131;
        double r25133 = exp(r25132);
        return r25133;
}


double f_of(float a, float b) {
        float r25134 = a;
        float r25135 = b;
        float r25136 = r25134 * r25135;
        return r25136;
}

double f_od(double a, double b) {
        double r25137 = a;
        double r25138 = b;
        double r25139 = r25137 * r25138;
        return r25139;
}

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 r25140, r25141, r25142, r25143, r25144, r25145;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r25140);
        mpfr_init(r25141);
        mpfr_init(r25142);
        mpfr_init(r25143);
        mpfr_init(r25144);
        mpfr_init(r25145);
}

double f_im(double a, double b) {
        mpfr_set_d(r25140, a, MPFR_RNDN);
        mpfr_log(r25141, r25140, MPFR_RNDN);
        mpfr_set_d(r25142, b, MPFR_RNDN);
        mpfr_log(r25143, r25142, MPFR_RNDN);
        mpfr_add(r25144, r25141, r25143, MPFR_RNDN);
        mpfr_exp(r25145, r25144, MPFR_RNDN);
        return mpfr_get_d(r25145, MPFR_RNDN);
}

static mpfr_t r25146, r25147, r25148;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r25146);
        mpfr_init(r25147);
        mpfr_init(r25148);
}

double f_fm(double a, double b) {
        mpfr_set_d(r25146, a, MPFR_RNDN);
        mpfr_set_d(r25147, b, MPFR_RNDN);
        mpfr_mul(r25148, r25146, r25147, MPFR_RNDN);
        return mpfr_get_d(r25148, MPFR_RNDN);
}

static mpfr_t r25149, r25150, r25151;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r25149);
        mpfr_init(r25150);
        mpfr_init(r25151);
}

double f_dm(double a, double b) {
        mpfr_set_d(r25149, a, MPFR_RNDN);
        mpfr_set_d(r25150, b, MPFR_RNDN);
        mpfr_mul(r25151, r25149, r25150, MPFR_RNDN);
        return mpfr_get_d(r25151, MPFR_RNDN);
}

