#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 r17488 = x;
        float r17489 = eps;
        float r17490 = r17488 + r17489;
        float r17491 = sin(r17490);
        float r17492 = sin(r17488);
        float r17493 = r17491 - r17492;
        return r17493;
}

double f_id(double x, double eps) {
        double r17494 = x;
        double r17495 = eps;
        double r17496 = r17494 + r17495;
        double r17497 = sin(r17496);
        double r17498 = sin(r17494);
        double r17499 = r17497 - r17498;
        return r17499;
}


double f_of(float x, float eps) {
        float r17500 = x;
        float r17501 = cos(r17500);
        float r17502 = eps;
        float r17503 = sin(r17502);
        float r17504 = r17501 * r17503;
        float r17505 = sin(r17500);
        float r17506 = cos(r17502);
        float r17507 = r17506 * r17505;
        float r17508 = r17505 - r17507;
        float r17509 = r17504 - r17508;
        return r17509;
}

double f_od(double x, double eps) {
        double r17510 = x;
        double r17511 = cos(r17510);
        double r17512 = eps;
        double r17513 = sin(r17512);
        double r17514 = r17511 * r17513;
        double r17515 = sin(r17510);
        double r17516 = cos(r17512);
        double r17517 = r17516 * r17515;
        double r17518 = r17515 - r17517;
        double r17519 = r17514 - r17518;
        return r17519;
}

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 r17520, r17521, r17522, r17523, r17524, r17525;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r17520);
        mpfr_init(r17521);
        mpfr_init(r17522);
        mpfr_init(r17523);
        mpfr_init(r17524);
        mpfr_init(r17525);
}

double f_im(double x, double eps) {
        mpfr_set_d(r17520, x, MPFR_RNDN);
        mpfr_set_d(r17521, eps, MPFR_RNDN);
        mpfr_add(r17522, r17520, r17521, MPFR_RNDN);
        mpfr_sin(r17523, r17522, MPFR_RNDN);
        mpfr_sin(r17524, r17520, MPFR_RNDN);
        mpfr_sub(r17525, r17523, r17524, MPFR_RNDN);
        return mpfr_get_d(r17525, MPFR_RNDN);
}

static mpfr_t r17526, r17527, r17528, r17529, r17530, r17531, r17532, r17533, r17534, r17535;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r17526);
        mpfr_init(r17527);
        mpfr_init(r17528);
        mpfr_init(r17529);
        mpfr_init(r17530);
        mpfr_init(r17531);
        mpfr_init(r17532);
        mpfr_init(r17533);
        mpfr_init(r17534);
        mpfr_init(r17535);
}

double f_fm(double x, double eps) {
        mpfr_set_d(r17526, x, MPFR_RNDN);
        mpfr_cos(r17527, r17526, MPFR_RNDN);
        mpfr_set_d(r17528, eps, MPFR_RNDN);
        mpfr_sin(r17529, r17528, MPFR_RNDN);
        mpfr_mul(r17530, r17527, r17529, MPFR_RNDN);
        mpfr_sin(r17531, r17526, MPFR_RNDN);
        mpfr_cos(r17532, r17528, MPFR_RNDN);
        mpfr_mul(r17533, r17532, r17531, MPFR_RNDN);
        mpfr_sub(r17534, r17531, r17533, MPFR_RNDN);
        mpfr_sub(r17535, r17530, r17534, MPFR_RNDN);
        return mpfr_get_d(r17535, MPFR_RNDN);
}

static mpfr_t r17536, r17537, r17538, r17539, r17540, r17541, r17542, r17543, r17544, r17545;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r17536);
        mpfr_init(r17537);
        mpfr_init(r17538);
        mpfr_init(r17539);
        mpfr_init(r17540);
        mpfr_init(r17541);
        mpfr_init(r17542);
        mpfr_init(r17543);
        mpfr_init(r17544);
        mpfr_init(r17545);
}

double f_dm(double x, double eps) {
        mpfr_set_d(r17536, x, MPFR_RNDN);
        mpfr_cos(r17537, r17536, MPFR_RNDN);
        mpfr_set_d(r17538, eps, MPFR_RNDN);
        mpfr_sin(r17539, r17538, MPFR_RNDN);
        mpfr_mul(r17540, r17537, r17539, MPFR_RNDN);
        mpfr_sin(r17541, r17536, MPFR_RNDN);
        mpfr_cos(r17542, r17538, MPFR_RNDN);
        mpfr_mul(r17543, r17542, r17541, MPFR_RNDN);
        mpfr_sub(r17544, r17541, r17543, MPFR_RNDN);
        mpfr_sub(r17545, r17540, r17544, MPFR_RNDN);
        return mpfr_get_d(r17545, MPFR_RNDN);
}

