#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 r25003 = a;
        float r25004 = log(r25003);
        float r25005 = b;
        float r25006 = log(r25005);
        float r25007 = r25004 + r25006;
        float r25008 = exp(r25007);
        return r25008;
}

double f_id(double a, double b) {
        double r25009 = a;
        double r25010 = log(r25009);
        double r25011 = b;
        double r25012 = log(r25011);
        double r25013 = r25010 + r25012;
        double r25014 = exp(r25013);
        return r25014;
}


double f_of(float a, float b) {
        float r25015 = a;
        float r25016 = b;
        float r25017 = r25015 * r25016;
        return r25017;
}

double f_od(double a, double b) {
        double r25018 = a;
        double r25019 = b;
        double r25020 = r25018 * r25019;
        return r25020;
}

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 r25021, r25022, r25023, r25024, r25025, r25026;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r25021);
        mpfr_init(r25022);
        mpfr_init(r25023);
        mpfr_init(r25024);
        mpfr_init(r25025);
        mpfr_init(r25026);
}

double f_im(double a, double b) {
        mpfr_set_d(r25021, a, MPFR_RNDN);
        mpfr_log(r25022, r25021, MPFR_RNDN);
        mpfr_set_d(r25023, b, MPFR_RNDN);
        mpfr_log(r25024, r25023, MPFR_RNDN);
        mpfr_add(r25025, r25022, r25024, MPFR_RNDN);
        mpfr_exp(r25026, r25025, MPFR_RNDN);
        return mpfr_get_d(r25026, MPFR_RNDN);
}

static mpfr_t r25027, r25028, r25029;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r25027);
        mpfr_init(r25028);
        mpfr_init(r25029);
}

double f_fm(double a, double b) {
        mpfr_set_d(r25027, a, MPFR_RNDN);
        mpfr_set_d(r25028, b, MPFR_RNDN);
        mpfr_mul(r25029, r25027, r25028, MPFR_RNDN);
        return mpfr_get_d(r25029, MPFR_RNDN);
}

static mpfr_t r25030, r25031, r25032;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r25030);
        mpfr_init(r25031);
        mpfr_init(r25032);
}

double f_dm(double a, double b) {
        mpfr_set_d(r25030, a, MPFR_RNDN);
        mpfr_set_d(r25031, b, MPFR_RNDN);
        mpfr_mul(r25032, r25030, r25031, MPFR_RNDN);
        return mpfr_get_d(r25032, MPFR_RNDN);
}

