#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 r8917 = lambda1;
        float r8918 = phi2;
        float r8919 = cos(r8918);
        float r8920 = lambda2;
        float r8921 = r8917 - r8920;
        float r8922 = sin(r8921);
        float r8923 = r8919 * r8922;
        float r8924 = phi1;
        float r8925 = cos(r8924);
        float r8926 = cos(r8921);
        float r8927 = r8919 * r8926;
        float r8928 = r8925 + r8927;
        float r8929 = atan2(r8923, r8928);
        float r8930 = r8917 + r8929;
        return r8930;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r8931 = lambda1;
        double r8932 = phi2;
        double r8933 = cos(r8932);
        double r8934 = lambda2;
        double r8935 = r8931 - r8934;
        double r8936 = sin(r8935);
        double r8937 = r8933 * r8936;
        double r8938 = phi1;
        double r8939 = cos(r8938);
        double r8940 = cos(r8935);
        double r8941 = r8933 * r8940;
        double r8942 = r8939 + r8941;
        double r8943 = atan2(r8937, r8942);
        double r8944 = r8931 + r8943;
        return r8944;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r8945 = lambda1;
        float r8946 = lambda2;
        float r8947 = cos(r8946);
        float r8948 = sin(r8945);
        float r8949 = r8947 * r8948;
        float r8950 = cos(r8945);
        float r8951 = -r8946;
        float r8952 = sin(r8951);
        float r8953 = r8950 * r8952;
        float r8954 = r8949 + r8953;
        float r8955 = phi2;
        float r8956 = cos(r8955);
        float r8957 = r8954 * r8956;
        float r8958 = r8947 * r8950;
        float r8959 = r8948 * r8952;
        float r8960 = r8958 - r8959;
        float r8961 = phi1;
        float r8962 = cos(r8961);
        float r8963 = fma(r8956, r8960, r8962);
        float r8964 = atan2(r8957, r8963);
        float r8965 = r8945 + r8964;
        return r8965;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r8966 = lambda1;
        double r8967 = lambda2;
        double r8968 = cos(r8967);
        double r8969 = sin(r8966);
        double r8970 = r8968 * r8969;
        double r8971 = cos(r8966);
        double r8972 = -r8967;
        double r8973 = sin(r8972);
        double r8974 = r8971 * r8973;
        double r8975 = r8970 + r8974;
        double r8976 = phi2;
        double r8977 = cos(r8976);
        double r8978 = r8975 * r8977;
        double r8979 = r8968 * r8971;
        double r8980 = r8969 * r8973;
        double r8981 = r8979 - r8980;
        double r8982 = phi1;
        double r8983 = cos(r8982);
        double r8984 = fma(r8977, r8981, r8983);
        double r8985 = atan2(r8978, r8984);
        double r8986 = r8966 + r8985;
        return r8986;
}

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 r8987, r8988, r8989, r8990, r8991, r8992, r8993, r8994, r8995, r8996, r8997, r8998, r8999, r9000;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8987);
        mpfr_init(r8988);
        mpfr_init(r8989);
        mpfr_init(r8990);
        mpfr_init(r8991);
        mpfr_init(r8992);
        mpfr_init(r8993);
        mpfr_init(r8994);
        mpfr_init(r8995);
        mpfr_init(r8996);
        mpfr_init(r8997);
        mpfr_init(r8998);
        mpfr_init(r8999);
        mpfr_init(r9000);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8987, lambda1, MPFR_RNDN);
        mpfr_set_d(r8988, phi2, MPFR_RNDN);
        mpfr_cos(r8989, r8988, MPFR_RNDN);
        mpfr_set_d(r8990, lambda2, MPFR_RNDN);
        mpfr_sub(r8991, r8987, r8990, MPFR_RNDN);
        mpfr_sin(r8992, r8991, MPFR_RNDN);
        mpfr_mul(r8993, r8989, r8992, MPFR_RNDN);
        mpfr_set_d(r8994, phi1, MPFR_RNDN);
        mpfr_cos(r8995, r8994, MPFR_RNDN);
        mpfr_cos(r8996, r8991, MPFR_RNDN);
        mpfr_mul(r8997, r8989, r8996, MPFR_RNDN);
        mpfr_add(r8998, r8995, r8997, MPFR_RNDN);
        mpfr_atan2(r8999, r8993, r8998, MPFR_RNDN);
        mpfr_add(r9000, r8987, r8999, MPFR_RNDN);
        return mpfr_get_d(r9000, MPFR_RNDN);
}

static mpfr_t r9001, r9002, r9003, r9004, r9005, r9006, r9007, r9008, r9009, r9010, r9011, r9012, r9013, r9014, r9015, r9016, r9017, r9018, r9019, r9020, r9021;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r9001);
        mpfr_init(r9002);
        mpfr_init(r9003);
        mpfr_init(r9004);
        mpfr_init(r9005);
        mpfr_init(r9006);
        mpfr_init(r9007);
        mpfr_init(r9008);
        mpfr_init(r9009);
        mpfr_init(r9010);
        mpfr_init(r9011);
        mpfr_init(r9012);
        mpfr_init(r9013);
        mpfr_init(r9014);
        mpfr_init(r9015);
        mpfr_init(r9016);
        mpfr_init(r9017);
        mpfr_init(r9018);
        mpfr_init(r9019);
        mpfr_init(r9020);
        mpfr_init(r9021);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r9001, lambda1, MPFR_RNDN);
        mpfr_set_d(r9002, lambda2, MPFR_RNDN);
        mpfr_cos(r9003, r9002, MPFR_RNDN);
        mpfr_sin(r9004, r9001, MPFR_RNDN);
        mpfr_mul(r9005, r9003, r9004, MPFR_RNDN);
        mpfr_cos(r9006, r9001, MPFR_RNDN);
        mpfr_neg(r9007, r9002, MPFR_RNDN);
        mpfr_sin(r9008, r9007, MPFR_RNDN);
        mpfr_mul(r9009, r9006, r9008, MPFR_RNDN);
        mpfr_add(r9010, r9005, r9009, MPFR_RNDN);
        mpfr_set_d(r9011, phi2, MPFR_RNDN);
        mpfr_cos(r9012, r9011, MPFR_RNDN);
        mpfr_mul(r9013, r9010, r9012, MPFR_RNDN);
        mpfr_mul(r9014, r9003, r9006, MPFR_RNDN);
        mpfr_mul(r9015, r9004, r9008, MPFR_RNDN);
        mpfr_sub(r9016, r9014, r9015, MPFR_RNDN);
        mpfr_set_d(r9017, phi1, MPFR_RNDN);
        mpfr_cos(r9018, r9017, MPFR_RNDN);
        mpfr_fma(r9019, r9012, r9016, r9018, MPFR_RNDN);
        mpfr_atan2(r9020, r9013, r9019, MPFR_RNDN);
        mpfr_add(r9021, r9001, r9020, MPFR_RNDN);
        return mpfr_get_d(r9021, MPFR_RNDN);
}

static mpfr_t r9022, r9023, r9024, r9025, r9026, r9027, r9028, r9029, r9030, r9031, r9032, r9033, r9034, r9035, r9036, r9037, r9038, r9039, r9040, r9041, r9042;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r9022);
        mpfr_init(r9023);
        mpfr_init(r9024);
        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);
        mpfr_init(r9039);
        mpfr_init(r9040);
        mpfr_init(r9041);
        mpfr_init(r9042);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r9022, lambda1, MPFR_RNDN);
        mpfr_set_d(r9023, lambda2, MPFR_RNDN);
        mpfr_cos(r9024, r9023, MPFR_RNDN);
        mpfr_sin(r9025, r9022, MPFR_RNDN);
        mpfr_mul(r9026, r9024, r9025, MPFR_RNDN);
        mpfr_cos(r9027, r9022, MPFR_RNDN);
        mpfr_neg(r9028, r9023, MPFR_RNDN);
        mpfr_sin(r9029, r9028, MPFR_RNDN);
        mpfr_mul(r9030, r9027, r9029, MPFR_RNDN);
        mpfr_add(r9031, r9026, r9030, MPFR_RNDN);
        mpfr_set_d(r9032, phi2, MPFR_RNDN);
        mpfr_cos(r9033, r9032, MPFR_RNDN);
        mpfr_mul(r9034, r9031, r9033, MPFR_RNDN);
        mpfr_mul(r9035, r9024, r9027, MPFR_RNDN);
        mpfr_mul(r9036, r9025, r9029, MPFR_RNDN);
        mpfr_sub(r9037, r9035, r9036, MPFR_RNDN);
        mpfr_set_d(r9038, phi1, MPFR_RNDN);
        mpfr_cos(r9039, r9038, MPFR_RNDN);
        mpfr_fma(r9040, r9033, r9037, r9039, MPFR_RNDN);
        mpfr_atan2(r9041, r9034, r9040, MPFR_RNDN);
        mpfr_add(r9042, r9022, r9041, MPFR_RNDN);
        return mpfr_get_d(r9042, MPFR_RNDN);
}

