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

char *name = "NMSE example 3.3";

double f_if(float x, float eps) {
        float r4620052 = x;
        float r4620053 = eps;
        float r4620054 = r4620052 + r4620053;
        float r4620055 = sin(r4620054);
        float r4620056 = sin(r4620052);
        float r4620057 = r4620055 - r4620056;
        return r4620057;
}

double f_id(double x, double eps) {
        double r4620058 = x;
        double r4620059 = eps;
        double r4620060 = r4620058 + r4620059;
        double r4620061 = sin(r4620060);
        double r4620062 = sin(r4620058);
        double r4620063 = r4620061 - r4620062;
        return r4620063;
}


double f_of(float x, float eps) {
        float r4620064 = eps;
        float r4620065 = cos(r4620064);
        float r4620066 = x;
        float r4620067 = sin(r4620066);
        float r4620068 = r4620065 * r4620067;
        float r4620069 = r4620068 - r4620067;
        float r4620070 = sin(r4620064);
        float r4620071 = cos(r4620066);
        float r4620072 = r4620070 * r4620071;
        float r4620073 = r4620069 + r4620072;
        return r4620073;
}

double f_od(double x, double eps) {
        double r4620074 = eps;
        double r4620075 = cos(r4620074);
        double r4620076 = x;
        double r4620077 = sin(r4620076);
        double r4620078 = r4620075 * r4620077;
        double r4620079 = r4620078 - r4620077;
        double r4620080 = sin(r4620074);
        double r4620081 = cos(r4620076);
        double r4620082 = r4620080 * r4620081;
        double r4620083 = r4620079 + r4620082;
        return r4620083;
}

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 r4620084, r4620085, r4620086, r4620087, r4620088, r4620089;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r4620084);
        mpfr_init(r4620085);
        mpfr_init(r4620086);
        mpfr_init(r4620087);
        mpfr_init(r4620088);
        mpfr_init(r4620089);
}

double f_im(double x, double eps) {
        mpfr_set_d(r4620084, x, MPFR_RNDN);
        mpfr_set_d(r4620085, eps, MPFR_RNDN);
        mpfr_add(r4620086, r4620084, r4620085, MPFR_RNDN);
        mpfr_sin(r4620087, r4620086, MPFR_RNDN);
        mpfr_sin(r4620088, r4620084, MPFR_RNDN);
        mpfr_sub(r4620089, r4620087, r4620088, MPFR_RNDN);
        return mpfr_get_d(r4620089, MPFR_RNDN);
}

static mpfr_t r4620090, r4620091, r4620092, r4620093, r4620094, r4620095, r4620096, r4620097, r4620098, r4620099;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r4620090);
        mpfr_init(r4620091);
        mpfr_init(r4620092);
        mpfr_init(r4620093);
        mpfr_init(r4620094);
        mpfr_init(r4620095);
        mpfr_init(r4620096);
        mpfr_init(r4620097);
        mpfr_init(r4620098);
        mpfr_init(r4620099);
}

double f_fm(double x, double eps) {
        mpfr_set_d(r4620090, eps, MPFR_RNDN);
        mpfr_cos(r4620091, r4620090, MPFR_RNDN);
        mpfr_set_d(r4620092, x, MPFR_RNDN);
        mpfr_sin(r4620093, r4620092, MPFR_RNDN);
        mpfr_mul(r4620094, r4620091, r4620093, MPFR_RNDN);
        mpfr_sub(r4620095, r4620094, r4620093, MPFR_RNDN);
        mpfr_sin(r4620096, r4620090, MPFR_RNDN);
        mpfr_cos(r4620097, r4620092, MPFR_RNDN);
        mpfr_mul(r4620098, r4620096, r4620097, MPFR_RNDN);
        mpfr_add(r4620099, r4620095, r4620098, MPFR_RNDN);
        return mpfr_get_d(r4620099, MPFR_RNDN);
}

static mpfr_t r4620100, r4620101, r4620102, r4620103, r4620104, r4620105, r4620106, r4620107, r4620108, r4620109;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r4620100);
        mpfr_init(r4620101);
        mpfr_init(r4620102);
        mpfr_init(r4620103);
        mpfr_init(r4620104);
        mpfr_init(r4620105);
        mpfr_init(r4620106);
        mpfr_init(r4620107);
        mpfr_init(r4620108);
        mpfr_init(r4620109);
}

double f_dm(double x, double eps) {
        mpfr_set_d(r4620100, eps, MPFR_RNDN);
        mpfr_cos(r4620101, r4620100, MPFR_RNDN);
        mpfr_set_d(r4620102, x, MPFR_RNDN);
        mpfr_sin(r4620103, r4620102, MPFR_RNDN);
        mpfr_mul(r4620104, r4620101, r4620103, MPFR_RNDN);
        mpfr_sub(r4620105, r4620104, r4620103, MPFR_RNDN);
        mpfr_sin(r4620106, r4620100, MPFR_RNDN);
        mpfr_cos(r4620107, r4620102, MPFR_RNDN);
        mpfr_mul(r4620108, r4620106, r4620107, MPFR_RNDN);
        mpfr_add(r4620109, r4620105, r4620108, MPFR_RNDN);
        return mpfr_get_d(r4620109, MPFR_RNDN);
}

