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

char *name = "Diagrams.Solve.Tridiagonal:solveTriDiagonal from diagrams-solve-0.1, C";

double f_if(float x, float y, float z) {
        float r53010 = x;
        float r53011 = y;
        float r53012 = z;
        float r53013 = r53011 * r53012;
        float r53014 = r53010 - r53013;
        return r53014;
}

double f_id(double x, double y, double z) {
        double r53015 = x;
        double r53016 = y;
        double r53017 = z;
        double r53018 = r53016 * r53017;
        double r53019 = r53015 - r53018;
        return r53019;
}


double f_of(float x, float y, float z) {
        float r53020 = x;
        float r53021 = y;
        float r53022 = z;
        float r53023 = r53021 * r53022;
        float r53024 = r53020 - r53023;
        return r53024;
}

double f_od(double x, double y, double z) {
        double r53025 = x;
        double r53026 = y;
        double r53027 = z;
        double r53028 = r53026 * r53027;
        double r53029 = r53025 - r53028;
        return r53029;
}

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 r53030, r53031, r53032, r53033, r53034;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r53030);
        mpfr_init(r53031);
        mpfr_init(r53032);
        mpfr_init(r53033);
        mpfr_init(r53034);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r53030, x, MPFR_RNDN);
        mpfr_set_d(r53031, y, MPFR_RNDN);
        mpfr_set_d(r53032, z, MPFR_RNDN);
        mpfr_mul(r53033, r53031, r53032, MPFR_RNDN);
        mpfr_sub(r53034, r53030, r53033, MPFR_RNDN);
        return mpfr_get_d(r53034, MPFR_RNDN);
}

static mpfr_t r53035, r53036, r53037, r53038, r53039;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r53035);
        mpfr_init(r53036);
        mpfr_init(r53037);
        mpfr_init(r53038);
        mpfr_init(r53039);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r53035, x, MPFR_RNDN);
        mpfr_set_d(r53036, y, MPFR_RNDN);
        mpfr_set_d(r53037, z, MPFR_RNDN);
        mpfr_mul(r53038, r53036, r53037, MPFR_RNDN);
        mpfr_sub(r53039, r53035, r53038, MPFR_RNDN);
        return mpfr_get_d(r53039, MPFR_RNDN);
}

static mpfr_t r53040, r53041, r53042, r53043, r53044;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r53040);
        mpfr_init(r53041);
        mpfr_init(r53042);
        mpfr_init(r53043);
        mpfr_init(r53044);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r53040, x, MPFR_RNDN);
        mpfr_set_d(r53041, y, MPFR_RNDN);
        mpfr_set_d(r53042, z, MPFR_RNDN);
        mpfr_mul(r53043, r53041, r53042, MPFR_RNDN);
        mpfr_sub(r53044, r53040, r53043, MPFR_RNDN);
        return mpfr_get_d(r53044, MPFR_RNDN);
}

