#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 r8058 = b;
        float r8059 = -r8058;
        float r8060 = r8058 * r8058;
        float r8061 = 4.0f;
        float r8062 = a;
        float r8063 = r8061 * r8062;
        float r8064 = c;
        float r8065 = r8063 * r8064;
        float r8066 = r8060 - r8065;
        float r8067 = sqrt(r8066);
        float r8068 = r8059 + r8067;
        float r8069 = 2.0f;
        float r8070 = r8069 * r8062;
        float r8071 = r8068 / r8070;
        return r8071;
}

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


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

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

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 r8120, r8121, r8122, r8123, r8124, r8125, r8126, r8127, r8128, r8129, r8130, r8131, r8132, r8133;

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

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

static mpfr_t r8134, r8135, r8136, r8137, r8138, r8139, r8140, r8141, r8142, r8143, r8144, r8145, r8146, r8147, r8148, r8149, r8150;

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

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

static mpfr_t r8151, r8152, r8153, r8154, r8155, r8156, r8157, r8158, r8159, r8160, r8161, r8162, r8163, r8164, r8165, r8166, r8167;

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

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

