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

char *name = "Data.Spline.Key:interpolateKeys from smoothie-0.4.0.2";

double f_if(float x) {
        float r55485 = x;
        float r55486 = r55485 * r55485;
        float r55487 = 3.0;
        float r55488 = 2.0;
        float r55489 = r55485 * r55488;
        float r55490 = r55487 - r55489;
        float r55491 = r55486 * r55490;
        return r55491;
}

double f_id(double x) {
        double r55492 = x;
        double r55493 = r55492 * r55492;
        double r55494 = 3.0;
        double r55495 = 2.0;
        double r55496 = r55492 * r55495;
        double r55497 = r55494 - r55496;
        double r55498 = r55493 * r55497;
        return r55498;
}


double f_of(float x) {
        float r55499 = x;
        float r55500 = r55499 * r55499;
        float r55501 = 3.0;
        float r55502 = r55500 * r55501;
        float r55503 = 2.0;
        float r55504 = -r55503;
        float r55505 = 3;
        float r55506 = pow(r55499, r55505);
        float r55507 = r55504 * r55506;
        float r55508 = r55502 + r55507;
        return r55508;
}

double f_od(double x) {
        double r55509 = x;
        double r55510 = r55509 * r55509;
        double r55511 = 3.0;
        double r55512 = r55510 * r55511;
        double r55513 = 2.0;
        double r55514 = -r55513;
        double r55515 = 3;
        double r55516 = pow(r55509, r55515);
        double r55517 = r55514 * r55516;
        double r55518 = r55512 + r55517;
        return r55518;
}

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 r55519, r55520, r55521, r55522, r55523, r55524, r55525;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r55519);
        mpfr_init(r55520);
        mpfr_init_set_str(r55521, "3.0", 10, MPFR_RNDN);
        mpfr_init_set_str(r55522, "2.0", 10, MPFR_RNDN);
        mpfr_init(r55523);
        mpfr_init(r55524);
        mpfr_init(r55525);
}

double f_im(double x) {
        mpfr_set_d(r55519, x, MPFR_RNDN);
        mpfr_mul(r55520, r55519, r55519, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r55523, r55519, r55522, MPFR_RNDN);
        mpfr_sub(r55524, r55521, r55523, MPFR_RNDN);
        mpfr_mul(r55525, r55520, r55524, MPFR_RNDN);
        return mpfr_get_d(r55525, MPFR_RNDN);
}

static mpfr_t r55526, r55527, r55528, r55529, r55530, r55531, r55532, r55533, r55534, r55535;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r55526);
        mpfr_init(r55527);
        mpfr_init_set_str(r55528, "3.0", 10, MPFR_RNDN);
        mpfr_init(r55529);
        mpfr_init_set_str(r55530, "2.0", 10, MPFR_RNDN);
        mpfr_init(r55531);
        mpfr_init_set_str(r55532, "3", 10, MPFR_RNDN);
        mpfr_init(r55533);
        mpfr_init(r55534);
        mpfr_init(r55535);
}

double f_fm(double x) {
        mpfr_set_d(r55526, x, MPFR_RNDN);
        mpfr_mul(r55527, r55526, r55526, MPFR_RNDN);
        ;
        mpfr_mul(r55529, r55527, r55528, MPFR_RNDN);
        ;
        mpfr_neg(r55531, r55530, MPFR_RNDN);
        ;
        mpfr_pow(r55533, r55526, r55532, MPFR_RNDN);
        mpfr_mul(r55534, r55531, r55533, MPFR_RNDN);
        mpfr_add(r55535, r55529, r55534, MPFR_RNDN);
        return mpfr_get_d(r55535, MPFR_RNDN);
}

static mpfr_t r55536, r55537, r55538, r55539, r55540, r55541, r55542, r55543, r55544, r55545;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r55536);
        mpfr_init(r55537);
        mpfr_init_set_str(r55538, "3.0", 10, MPFR_RNDN);
        mpfr_init(r55539);
        mpfr_init_set_str(r55540, "2.0", 10, MPFR_RNDN);
        mpfr_init(r55541);
        mpfr_init_set_str(r55542, "3", 10, MPFR_RNDN);
        mpfr_init(r55543);
        mpfr_init(r55544);
        mpfr_init(r55545);
}

double f_dm(double x) {
        mpfr_set_d(r55536, x, MPFR_RNDN);
        mpfr_mul(r55537, r55536, r55536, MPFR_RNDN);
        ;
        mpfr_mul(r55539, r55537, r55538, MPFR_RNDN);
        ;
        mpfr_neg(r55541, r55540, MPFR_RNDN);
        ;
        mpfr_pow(r55543, r55536, r55542, MPFR_RNDN);
        mpfr_mul(r55544, r55541, r55543, MPFR_RNDN);
        mpfr_add(r55545, r55539, r55544, MPFR_RNDN);
        return mpfr_get_d(r55545, MPFR_RNDN);
}

