#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 r8953 = lambda1;
        float r8954 = phi2;
        float r8955 = cos(r8954);
        float r8956 = lambda2;
        float r8957 = r8953 - r8956;
        float r8958 = sin(r8957);
        float r8959 = r8955 * r8958;
        float r8960 = phi1;
        float r8961 = cos(r8960);
        float r8962 = cos(r8957);
        float r8963 = r8955 * r8962;
        float r8964 = r8961 + r8963;
        float r8965 = atan2(r8959, r8964);
        float r8966 = r8953 + r8965;
        return r8966;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r8967 = lambda1;
        double r8968 = phi2;
        double r8969 = cos(r8968);
        double r8970 = lambda2;
        double r8971 = r8967 - r8970;
        double r8972 = sin(r8971);
        double r8973 = r8969 * r8972;
        double r8974 = phi1;
        double r8975 = cos(r8974);
        double r8976 = cos(r8971);
        double r8977 = r8969 * r8976;
        double r8978 = r8975 + r8977;
        double r8979 = atan2(r8973, r8978);
        double r8980 = r8967 + r8979;
        return r8980;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r8981 = lambda1;
        float r8982 = phi2;
        float r8983 = cos(r8982);
        float r8984 = lambda2;
        float r8985 = cos(r8984);
        float r8986 = sin(r8981);
        float r8987 = r8985 * r8986;
        float r8988 = cos(r8981);
        float r8989 = -r8984;
        float r8990 = sin(r8989);
        float r8991 = r8988 * r8990;
        float r8992 = r8987 + r8991;
        float r8993 = r8983 * r8992;
        float r8994 = phi1;
        float r8995 = cos(r8994);
        float r8996 = r8985 * r8988;
        float r8997 = r8986 * r8990;
        float r8998 = r8996 - r8997;
        float r8999 = r8983 * r8998;
        float r9000 = r8995 + r8999;
        float r9001 = atan2(r8993, r9000);
        float r9002 = r8981 + r9001;
        return r9002;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r9003 = lambda1;
        double r9004 = phi2;
        double r9005 = cos(r9004);
        double r9006 = lambda2;
        double r9007 = cos(r9006);
        double r9008 = sin(r9003);
        double r9009 = r9007 * r9008;
        double r9010 = cos(r9003);
        double r9011 = -r9006;
        double r9012 = sin(r9011);
        double r9013 = r9010 * r9012;
        double r9014 = r9009 + r9013;
        double r9015 = r9005 * r9014;
        double r9016 = phi1;
        double r9017 = cos(r9016);
        double r9018 = r9007 * r9010;
        double r9019 = r9008 * r9012;
        double r9020 = r9018 - r9019;
        double r9021 = r9005 * r9020;
        double r9022 = r9017 + r9021;
        double r9023 = atan2(r9015, r9022);
        double r9024 = r9003 + r9023;
        return r9024;
}

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 r9025, r9026, r9027, r9028, r9029, r9030, r9031, r9032, r9033, r9034, r9035, r9036, r9037, r9038;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r9025);
        mpfr_init(r9026);
        mpfr_init(r9027);
        mpfr_init(r9028);
        mpfr_init(r9029);
        mpfr_init(r9030);
        mpfr_init(r9031);
        mpfr_init(r9032);
        mpfr_init(r9033);
        mpfr_init(r9034);
        mpfr_init(r9035);
        mpfr_init(r9036);
        mpfr_init(r9037);
        mpfr_init(r9038);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r9025, lambda1, MPFR_RNDN);
        mpfr_set_d(r9026, phi2, MPFR_RNDN);
        mpfr_cos(r9027, r9026, MPFR_RNDN);
        mpfr_set_d(r9028, lambda2, MPFR_RNDN);
        mpfr_sub(r9029, r9025, r9028, MPFR_RNDN);
        mpfr_sin(r9030, r9029, MPFR_RNDN);
        mpfr_mul(r9031, r9027, r9030, MPFR_RNDN);
        mpfr_set_d(r9032, phi1, MPFR_RNDN);
        mpfr_cos(r9033, r9032, MPFR_RNDN);
        mpfr_cos(r9034, r9029, MPFR_RNDN);
        mpfr_mul(r9035, r9027, r9034, MPFR_RNDN);
        mpfr_add(r9036, r9033, r9035, MPFR_RNDN);
        mpfr_atan2(r9037, r9031, r9036, MPFR_RNDN);
        mpfr_add(r9038, r9025, r9037, MPFR_RNDN);
        return mpfr_get_d(r9038, MPFR_RNDN);
}

static mpfr_t r9039, r9040, r9041, r9042, r9043, r9044, r9045, r9046, r9047, r9048, r9049, r9050, r9051, r9052, r9053, r9054, r9055, r9056, r9057, r9058, r9059, r9060;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r9039);
        mpfr_init(r9040);
        mpfr_init(r9041);
        mpfr_init(r9042);
        mpfr_init(r9043);
        mpfr_init(r9044);
        mpfr_init(r9045);
        mpfr_init(r9046);
        mpfr_init(r9047);
        mpfr_init(r9048);
        mpfr_init(r9049);
        mpfr_init(r9050);
        mpfr_init(r9051);
        mpfr_init(r9052);
        mpfr_init(r9053);
        mpfr_init(r9054);
        mpfr_init(r9055);
        mpfr_init(r9056);
        mpfr_init(r9057);
        mpfr_init(r9058);
        mpfr_init(r9059);
        mpfr_init(r9060);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r9039, lambda1, MPFR_RNDN);
        mpfr_set_d(r9040, phi2, MPFR_RNDN);
        mpfr_cos(r9041, r9040, MPFR_RNDN);
        mpfr_set_d(r9042, lambda2, MPFR_RNDN);
        mpfr_cos(r9043, r9042, MPFR_RNDN);
        mpfr_sin(r9044, r9039, MPFR_RNDN);
        mpfr_mul(r9045, r9043, r9044, MPFR_RNDN);
        mpfr_cos(r9046, r9039, MPFR_RNDN);
        mpfr_neg(r9047, r9042, MPFR_RNDN);
        mpfr_sin(r9048, r9047, MPFR_RNDN);
        mpfr_mul(r9049, r9046, r9048, MPFR_RNDN);
        mpfr_add(r9050, r9045, r9049, MPFR_RNDN);
        mpfr_mul(r9051, r9041, r9050, MPFR_RNDN);
        mpfr_set_d(r9052, phi1, MPFR_RNDN);
        mpfr_cos(r9053, r9052, MPFR_RNDN);
        mpfr_mul(r9054, r9043, r9046, MPFR_RNDN);
        mpfr_mul(r9055, r9044, r9048, MPFR_RNDN);
        mpfr_sub(r9056, r9054, r9055, MPFR_RNDN);
        mpfr_mul(r9057, r9041, r9056, MPFR_RNDN);
        mpfr_add(r9058, r9053, r9057, MPFR_RNDN);
        mpfr_atan2(r9059, r9051, r9058, MPFR_RNDN);
        mpfr_add(r9060, r9039, r9059, MPFR_RNDN);
        return mpfr_get_d(r9060, MPFR_RNDN);
}

static mpfr_t r9061, r9062, r9063, r9064, r9065, r9066, r9067, r9068, r9069, r9070, r9071, r9072, r9073, r9074, r9075, r9076, r9077, r9078, r9079, r9080, r9081, r9082;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r9061);
        mpfr_init(r9062);
        mpfr_init(r9063);
        mpfr_init(r9064);
        mpfr_init(r9065);
        mpfr_init(r9066);
        mpfr_init(r9067);
        mpfr_init(r9068);
        mpfr_init(r9069);
        mpfr_init(r9070);
        mpfr_init(r9071);
        mpfr_init(r9072);
        mpfr_init(r9073);
        mpfr_init(r9074);
        mpfr_init(r9075);
        mpfr_init(r9076);
        mpfr_init(r9077);
        mpfr_init(r9078);
        mpfr_init(r9079);
        mpfr_init(r9080);
        mpfr_init(r9081);
        mpfr_init(r9082);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r9061, lambda1, MPFR_RNDN);
        mpfr_set_d(r9062, phi2, MPFR_RNDN);
        mpfr_cos(r9063, r9062, MPFR_RNDN);
        mpfr_set_d(r9064, lambda2, MPFR_RNDN);
        mpfr_cos(r9065, r9064, MPFR_RNDN);
        mpfr_sin(r9066, r9061, MPFR_RNDN);
        mpfr_mul(r9067, r9065, r9066, MPFR_RNDN);
        mpfr_cos(r9068, r9061, MPFR_RNDN);
        mpfr_neg(r9069, r9064, MPFR_RNDN);
        mpfr_sin(r9070, r9069, MPFR_RNDN);
        mpfr_mul(r9071, r9068, r9070, MPFR_RNDN);
        mpfr_add(r9072, r9067, r9071, MPFR_RNDN);
        mpfr_mul(r9073, r9063, r9072, MPFR_RNDN);
        mpfr_set_d(r9074, phi1, MPFR_RNDN);
        mpfr_cos(r9075, r9074, MPFR_RNDN);
        mpfr_mul(r9076, r9065, r9068, MPFR_RNDN);
        mpfr_mul(r9077, r9066, r9070, MPFR_RNDN);
        mpfr_sub(r9078, r9076, r9077, MPFR_RNDN);
        mpfr_mul(r9079, r9063, r9078, MPFR_RNDN);
        mpfr_add(r9080, r9075, r9079, MPFR_RNDN);
        mpfr_atan2(r9081, r9073, r9080, MPFR_RNDN);
        mpfr_add(r9082, r9061, r9081, MPFR_RNDN);
        return mpfr_get_d(r9082, MPFR_RNDN);
}

