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

char *name = "Midpoint on a great circle";

double f_if(float lambda1, float lambda2, float phi1, float phi2) {
        float r28046 = lambda1;
        float r28047 = phi2;
        float r28048 = cos(r28047);
        float r28049 = lambda2;
        float r28050 = r28046 - r28049;
        float r28051 = sin(r28050);
        float r28052 = r28048 * r28051;
        float r28053 = phi1;
        float r28054 = cos(r28053);
        float r28055 = cos(r28050);
        float r28056 = r28048 * r28055;
        float r28057 = r28054 + r28056;
        float r28058 = atan2(r28052, r28057);
        float r28059 = r28046 + r28058;
        return r28059;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r28060 = lambda1;
        double r28061 = phi2;
        double r28062 = cos(r28061);
        double r28063 = lambda2;
        double r28064 = r28060 - r28063;
        double r28065 = sin(r28064);
        double r28066 = r28062 * r28065;
        double r28067 = phi1;
        double r28068 = cos(r28067);
        double r28069 = cos(r28064);
        double r28070 = r28062 * r28069;
        double r28071 = r28068 + r28070;
        double r28072 = atan2(r28066, r28071);
        double r28073 = r28060 + r28072;
        return r28073;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r28074 = lambda1;
        float r28075 = phi2;
        float r28076 = cos(r28075);
        float r28077 = lambda2;
        float r28078 = r28074 - r28077;
        float r28079 = sin(r28078);
        float r28080 = r28076 * r28079;
        float r28081 = phi1;
        float r28082 = cos(r28081);
        float r28083 = 3;
        float r28084 = pow(r28082, r28083);
        float r28085 = cos(r28078);
        float r28086 = r28076 * r28085;
        float r28087 = pow(r28086, r28083);
        float r28088 = r28084 + r28087;
        float r28089 = r28082 * r28082;
        float r28090 = r28086 * r28086;
        float r28091 = r28082 * r28086;
        float r28092 = r28090 - r28091;
        float r28093 = r28089 + r28092;
        float r28094 = r28088 / r28093;
        float r28095 = atan2(r28080, r28094);
        float r28096 = r28074 + r28095;
        return r28096;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r28097 = lambda1;
        double r28098 = phi2;
        double r28099 = cos(r28098);
        double r28100 = lambda2;
        double r28101 = r28097 - r28100;
        double r28102 = sin(r28101);
        double r28103 = r28099 * r28102;
        double r28104 = phi1;
        double r28105 = cos(r28104);
        double r28106 = 3;
        double r28107 = pow(r28105, r28106);
        double r28108 = cos(r28101);
        double r28109 = r28099 * r28108;
        double r28110 = pow(r28109, r28106);
        double r28111 = r28107 + r28110;
        double r28112 = r28105 * r28105;
        double r28113 = r28109 * r28109;
        double r28114 = r28105 * r28109;
        double r28115 = r28113 - r28114;
        double r28116 = r28112 + r28115;
        double r28117 = r28111 / r28116;
        double r28118 = atan2(r28103, r28117);
        double r28119 = r28097 + r28118;
        return r28119;
}

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 r28120, r28121, r28122, r28123, r28124, r28125, r28126, r28127, r28128, r28129, r28130, r28131, r28132, r28133;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r28120);
        mpfr_init(r28121);
        mpfr_init(r28122);
        mpfr_init(r28123);
        mpfr_init(r28124);
        mpfr_init(r28125);
        mpfr_init(r28126);
        mpfr_init(r28127);
        mpfr_init(r28128);
        mpfr_init(r28129);
        mpfr_init(r28130);
        mpfr_init(r28131);
        mpfr_init(r28132);
        mpfr_init(r28133);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r28120, lambda1, MPFR_RNDN);
        mpfr_set_d(r28121, phi2, MPFR_RNDN);
        mpfr_cos(r28122, r28121, MPFR_RNDN);
        mpfr_set_d(r28123, lambda2, MPFR_RNDN);
        mpfr_sub(r28124, r28120, r28123, MPFR_RNDN);
        mpfr_sin(r28125, r28124, MPFR_RNDN);
        mpfr_mul(r28126, r28122, r28125, MPFR_RNDN);
        mpfr_set_d(r28127, phi1, MPFR_RNDN);
        mpfr_cos(r28128, r28127, MPFR_RNDN);
        mpfr_cos(r28129, r28124, MPFR_RNDN);
        mpfr_mul(r28130, r28122, r28129, MPFR_RNDN);
        mpfr_add(r28131, r28128, r28130, MPFR_RNDN);
        mpfr_atan2(r28132, r28126, r28131, MPFR_RNDN);
        mpfr_add(r28133, r28120, r28132, MPFR_RNDN);
        return mpfr_get_d(r28133, MPFR_RNDN);
}

static mpfr_t r28134, r28135, r28136, r28137, r28138, r28139, r28140, r28141, r28142, r28143, r28144, r28145, r28146, r28147, r28148, r28149, r28150, r28151, r28152, r28153, r28154, r28155, r28156;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r28134);
        mpfr_init(r28135);
        mpfr_init(r28136);
        mpfr_init(r28137);
        mpfr_init(r28138);
        mpfr_init(r28139);
        mpfr_init(r28140);
        mpfr_init(r28141);
        mpfr_init(r28142);
        mpfr_init_set_str(r28143, "3", 10, MPFR_RNDN);
        mpfr_init(r28144);
        mpfr_init(r28145);
        mpfr_init(r28146);
        mpfr_init(r28147);
        mpfr_init(r28148);
        mpfr_init(r28149);
        mpfr_init(r28150);
        mpfr_init(r28151);
        mpfr_init(r28152);
        mpfr_init(r28153);
        mpfr_init(r28154);
        mpfr_init(r28155);
        mpfr_init(r28156);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r28134, lambda1, MPFR_RNDN);
        mpfr_set_d(r28135, phi2, MPFR_RNDN);
        mpfr_cos(r28136, r28135, MPFR_RNDN);
        mpfr_set_d(r28137, lambda2, MPFR_RNDN);
        mpfr_sub(r28138, r28134, r28137, MPFR_RNDN);
        mpfr_sin(r28139, r28138, MPFR_RNDN);
        mpfr_mul(r28140, r28136, r28139, MPFR_RNDN);
        mpfr_set_d(r28141, phi1, MPFR_RNDN);
        mpfr_cos(r28142, r28141, MPFR_RNDN);
        ;
        mpfr_pow(r28144, r28142, r28143, MPFR_RNDN);
        mpfr_cos(r28145, r28138, MPFR_RNDN);
        mpfr_mul(r28146, r28136, r28145, MPFR_RNDN);
        mpfr_pow(r28147, r28146, r28143, MPFR_RNDN);
        mpfr_add(r28148, r28144, r28147, MPFR_RNDN);
        mpfr_mul(r28149, r28142, r28142, MPFR_RNDN);
        mpfr_mul(r28150, r28146, r28146, MPFR_RNDN);
        mpfr_mul(r28151, r28142, r28146, MPFR_RNDN);
        mpfr_sub(r28152, r28150, r28151, MPFR_RNDN);
        mpfr_add(r28153, r28149, r28152, MPFR_RNDN);
        mpfr_div(r28154, r28148, r28153, MPFR_RNDN);
        mpfr_atan2(r28155, r28140, r28154, MPFR_RNDN);
        mpfr_add(r28156, r28134, r28155, MPFR_RNDN);
        return mpfr_get_d(r28156, MPFR_RNDN);
}

static mpfr_t r28157, r28158, r28159, r28160, r28161, r28162, r28163, r28164, r28165, r28166, r28167, r28168, r28169, r28170, r28171, r28172, r28173, r28174, r28175, r28176, r28177, r28178, r28179;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r28157);
        mpfr_init(r28158);
        mpfr_init(r28159);
        mpfr_init(r28160);
        mpfr_init(r28161);
        mpfr_init(r28162);
        mpfr_init(r28163);
        mpfr_init(r28164);
        mpfr_init(r28165);
        mpfr_init_set_str(r28166, "3", 10, MPFR_RNDN);
        mpfr_init(r28167);
        mpfr_init(r28168);
        mpfr_init(r28169);
        mpfr_init(r28170);
        mpfr_init(r28171);
        mpfr_init(r28172);
        mpfr_init(r28173);
        mpfr_init(r28174);
        mpfr_init(r28175);
        mpfr_init(r28176);
        mpfr_init(r28177);
        mpfr_init(r28178);
        mpfr_init(r28179);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r28157, lambda1, MPFR_RNDN);
        mpfr_set_d(r28158, phi2, MPFR_RNDN);
        mpfr_cos(r28159, r28158, MPFR_RNDN);
        mpfr_set_d(r28160, lambda2, MPFR_RNDN);
        mpfr_sub(r28161, r28157, r28160, MPFR_RNDN);
        mpfr_sin(r28162, r28161, MPFR_RNDN);
        mpfr_mul(r28163, r28159, r28162, MPFR_RNDN);
        mpfr_set_d(r28164, phi1, MPFR_RNDN);
        mpfr_cos(r28165, r28164, MPFR_RNDN);
        ;
        mpfr_pow(r28167, r28165, r28166, MPFR_RNDN);
        mpfr_cos(r28168, r28161, MPFR_RNDN);
        mpfr_mul(r28169, r28159, r28168, MPFR_RNDN);
        mpfr_pow(r28170, r28169, r28166, MPFR_RNDN);
        mpfr_add(r28171, r28167, r28170, MPFR_RNDN);
        mpfr_mul(r28172, r28165, r28165, MPFR_RNDN);
        mpfr_mul(r28173, r28169, r28169, MPFR_RNDN);
        mpfr_mul(r28174, r28165, r28169, MPFR_RNDN);
        mpfr_sub(r28175, r28173, r28174, MPFR_RNDN);
        mpfr_add(r28176, r28172, r28175, MPFR_RNDN);
        mpfr_div(r28177, r28171, r28176, MPFR_RNDN);
        mpfr_atan2(r28178, r28163, r28177, MPFR_RNDN);
        mpfr_add(r28179, r28157, r28178, MPFR_RNDN);
        return mpfr_get_d(r28179, MPFR_RNDN);
}

