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

char *name = "Quadratic roots, medium range";

double f_if(float a, float b, float c) {
        float r8061 = b;
        float r8062 = -r8061;
        float r8063 = r8061 * r8061;
        float r8064 = 4.0f;
        float r8065 = a;
        float r8066 = r8064 * r8065;
        float r8067 = c;
        float r8068 = r8066 * r8067;
        float r8069 = r8063 - r8068;
        float r8070 = sqrt(r8069);
        float r8071 = r8062 + r8070;
        float r8072 = 2.0f;
        float r8073 = r8072 * r8065;
        float r8074 = r8071 / r8073;
        return r8074;
}

double f_id(double a, double b, double c) {
        double r8075 = b;
        double r8076 = -r8075;
        double r8077 = r8075 * r8075;
        double r8078 = 4.0;
        double r8079 = a;
        double r8080 = r8078 * r8079;
        double r8081 = c;
        double r8082 = r8080 * r8081;
        double r8083 = r8077 - r8082;
        double r8084 = sqrt(r8083);
        double r8085 = r8076 + r8084;
        double r8086 = 2.0;
        double r8087 = r8086 * r8079;
        double r8088 = r8085 / r8087;
        return r8088;
}


double f_of(float a, float b, float c) {
        float r8089 = a;
        float r8090 = c;
        float r8091 = r8089 * r8090;
        float r8092 = 4.0f;
        float r8093 = r8091 * r8092;
        float r8094 = 2.0f;
        float r8095 = r8089 * r8094;
        float r8096 = r8093 / r8095;
        float r8097 = b;
        float r8098 = -r8097;
        float r8099 = r8097 * r8097;
        float r8100 = r8092 * r8089;
        float r8101 = r8100 * r8090;
        float r8102 = r8099 - r8101;
        float r8103 = sqrt(r8102);
        float r8104 = r8098 - r8103;
        float r8105 = r8096 / r8104;
        return r8105;
}

double f_od(double a, double b, double c) {
        double r8106 = a;
        double r8107 = c;
        double r8108 = r8106 * r8107;
        double r8109 = 4.0;
        double r8110 = r8108 * r8109;
        double r8111 = 2.0;
        double r8112 = r8106 * r8111;
        double r8113 = r8110 / r8112;
        double r8114 = b;
        double r8115 = -r8114;
        double r8116 = r8114 * r8114;
        double r8117 = r8109 * r8106;
        double r8118 = r8117 * r8107;
        double r8119 = r8116 - r8118;
        double r8120 = sqrt(r8119);
        double r8121 = r8115 - r8120;
        double r8122 = r8113 / r8121;
        return r8122;
}

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 r8123, r8124, r8125, r8126, r8127, r8128, r8129, r8130, r8131, r8132, r8133, r8134, r8135, r8136;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r8123);
        mpfr_init(r8124);
        mpfr_init(r8125);
        mpfr_init_set_str(r8126, "4", 10, MPFR_RNDN);
        mpfr_init(r8127);
        mpfr_init(r8128);
        mpfr_init(r8129);
        mpfr_init(r8130);
        mpfr_init(r8131);
        mpfr_init(r8132);
        mpfr_init(r8133);
        mpfr_init_set_str(r8134, "2", 10, MPFR_RNDN);
        mpfr_init(r8135);
        mpfr_init(r8136);
}

double f_im(double a, double b, double c) {
        mpfr_set_d(r8123, b, MPFR_RNDN);
        mpfr_neg(r8124, r8123, MPFR_RNDN);
        mpfr_mul(r8125, r8123, r8123, MPFR_RNDN);
        ;
        mpfr_set_d(r8127, a, MPFR_RNDN);
        mpfr_mul(r8128, r8126, r8127, MPFR_RNDN);
        mpfr_set_d(r8129, c, MPFR_RNDN);
        mpfr_mul(r8130, r8128, r8129, MPFR_RNDN);
        mpfr_sub(r8131, r8125, r8130, MPFR_RNDN);
        mpfr_sqrt(r8132, r8131, MPFR_RNDN);
        mpfr_add(r8133, r8124, r8132, MPFR_RNDN);
        ;
        mpfr_mul(r8135, r8134, r8127, MPFR_RNDN);
        mpfr_div(r8136, r8133, r8135, MPFR_RNDN);
        return mpfr_get_d(r8136, MPFR_RNDN);
}

static mpfr_t r8137, r8138, r8139, r8140, r8141, r8142, r8143, r8144, r8145, r8146, r8147, r8148, r8149, r8150, r8151, r8152, r8153;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8137);
        mpfr_init(r8138);
        mpfr_init(r8139);
        mpfr_init_set_str(r8140, "4", 10, MPFR_RNDN);
        mpfr_init(r8141);
        mpfr_init_set_str(r8142, "2", 10, MPFR_RNDN);
        mpfr_init(r8143);
        mpfr_init(r8144);
        mpfr_init(r8145);
        mpfr_init(r8146);
        mpfr_init(r8147);
        mpfr_init(r8148);
        mpfr_init(r8149);
        mpfr_init(r8150);
        mpfr_init(r8151);
        mpfr_init(r8152);
        mpfr_init(r8153);
}

double f_fm(double a, double b, double c) {
        mpfr_set_d(r8137, a, MPFR_RNDN);
        mpfr_set_d(r8138, c, MPFR_RNDN);
        mpfr_mul(r8139, r8137, r8138, MPFR_RNDN);
        ;
        mpfr_mul(r8141, r8139, r8140, MPFR_RNDN);
        ;
        mpfr_mul(r8143, r8137, r8142, MPFR_RNDN);
        mpfr_div(r8144, r8141, r8143, MPFR_RNDN);
        mpfr_set_d(r8145, b, MPFR_RNDN);
        mpfr_neg(r8146, r8145, MPFR_RNDN);
        mpfr_mul(r8147, r8145, r8145, MPFR_RNDN);
        mpfr_mul(r8148, r8140, r8137, MPFR_RNDN);
        mpfr_mul(r8149, r8148, r8138, MPFR_RNDN);
        mpfr_sub(r8150, r8147, r8149, MPFR_RNDN);
        mpfr_sqrt(r8151, r8150, MPFR_RNDN);
        mpfr_sub(r8152, r8146, r8151, MPFR_RNDN);
        mpfr_div(r8153, r8144, r8152, MPFR_RNDN);
        return mpfr_get_d(r8153, MPFR_RNDN);
}

static mpfr_t r8154, r8155, r8156, r8157, r8158, r8159, r8160, r8161, r8162, r8163, r8164, r8165, r8166, r8167, r8168, r8169, r8170;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8154);
        mpfr_init(r8155);
        mpfr_init(r8156);
        mpfr_init_set_str(r8157, "4", 10, MPFR_RNDN);
        mpfr_init(r8158);
        mpfr_init_set_str(r8159, "2", 10, MPFR_RNDN);
        mpfr_init(r8160);
        mpfr_init(r8161);
        mpfr_init(r8162);
        mpfr_init(r8163);
        mpfr_init(r8164);
        mpfr_init(r8165);
        mpfr_init(r8166);
        mpfr_init(r8167);
        mpfr_init(r8168);
        mpfr_init(r8169);
        mpfr_init(r8170);
}

double f_dm(double a, double b, double c) {
        mpfr_set_d(r8154, a, MPFR_RNDN);
        mpfr_set_d(r8155, c, MPFR_RNDN);
        mpfr_mul(r8156, r8154, r8155, MPFR_RNDN);
        ;
        mpfr_mul(r8158, r8156, r8157, MPFR_RNDN);
        ;
        mpfr_mul(r8160, r8154, r8159, MPFR_RNDN);
        mpfr_div(r8161, r8158, r8160, MPFR_RNDN);
        mpfr_set_d(r8162, b, MPFR_RNDN);
        mpfr_neg(r8163, r8162, MPFR_RNDN);
        mpfr_mul(r8164, r8162, r8162, MPFR_RNDN);
        mpfr_mul(r8165, r8157, r8154, MPFR_RNDN);
        mpfr_mul(r8166, r8165, r8155, MPFR_RNDN);
        mpfr_sub(r8167, r8164, r8166, MPFR_RNDN);
        mpfr_sqrt(r8168, r8167, MPFR_RNDN);
        mpfr_sub(r8169, r8163, r8168, MPFR_RNDN);
        mpfr_div(r8170, r8161, r8169, MPFR_RNDN);
        return mpfr_get_d(r8170, MPFR_RNDN);
}

