#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 r18360728 = lambda1;
        float r18360729 = phi2;
        float r18360730 = cos(r18360729);
        float r18360731 = lambda2;
        float r18360732 = r18360728 - r18360731;
        float r18360733 = sin(r18360732);
        float r18360734 = r18360730 * r18360733;
        float r18360735 = phi1;
        float r18360736 = cos(r18360735);
        float r18360737 = cos(r18360732);
        float r18360738 = r18360730 * r18360737;
        float r18360739 = r18360736 + r18360738;
        float r18360740 = atan2(r18360734, r18360739);
        float r18360741 = r18360728 + r18360740;
        return r18360741;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r18360742 = lambda1;
        double r18360743 = phi2;
        double r18360744 = cos(r18360743);
        double r18360745 = lambda2;
        double r18360746 = r18360742 - r18360745;
        double r18360747 = sin(r18360746);
        double r18360748 = r18360744 * r18360747;
        double r18360749 = phi1;
        double r18360750 = cos(r18360749);
        double r18360751 = cos(r18360746);
        double r18360752 = r18360744 * r18360751;
        double r18360753 = r18360750 + r18360752;
        double r18360754 = atan2(r18360748, r18360753);
        double r18360755 = r18360742 + r18360754;
        return r18360755;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r18360756 = lambda1;
        float r18360757 = phi2;
        float r18360758 = cos(r18360757);
        float r18360759 = sin(r18360756);
        float r18360760 = lambda2;
        float r18360761 = cos(r18360760);
        float r18360762 = r18360759 * r18360761;
        float r18360763 = cos(r18360756);
        float r18360764 = -r18360760;
        float r18360765 = sin(r18360764);
        float r18360766 = r18360763 * r18360765;
        float r18360767 = r18360762 + r18360766;
        float r18360768 = r18360758 * r18360767;
        float r18360769 = phi1;
        float r18360770 = cos(r18360769);
        float r18360771 = r18360763 * r18360761;
        float r18360772 = r18360758 * r18360771;
        float r18360773 = r18360770 + r18360772;
        float r18360774 = sin(r18360760);
        float r18360775 = r18360759 * r18360774;
        float r18360776 = r18360758 * r18360775;
        float r18360777 = r18360773 + r18360776;
        float r18360778 = atan2(r18360768, r18360777);
        float r18360779 = r18360756 + r18360778;
        return r18360779;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r18360780 = lambda1;
        double r18360781 = phi2;
        double r18360782 = cos(r18360781);
        double r18360783 = sin(r18360780);
        double r18360784 = lambda2;
        double r18360785 = cos(r18360784);
        double r18360786 = r18360783 * r18360785;
        double r18360787 = cos(r18360780);
        double r18360788 = -r18360784;
        double r18360789 = sin(r18360788);
        double r18360790 = r18360787 * r18360789;
        double r18360791 = r18360786 + r18360790;
        double r18360792 = r18360782 * r18360791;
        double r18360793 = phi1;
        double r18360794 = cos(r18360793);
        double r18360795 = r18360787 * r18360785;
        double r18360796 = r18360782 * r18360795;
        double r18360797 = r18360794 + r18360796;
        double r18360798 = sin(r18360784);
        double r18360799 = r18360783 * r18360798;
        double r18360800 = r18360782 * r18360799;
        double r18360801 = r18360797 + r18360800;
        double r18360802 = atan2(r18360792, r18360801);
        double r18360803 = r18360780 + r18360802;
        return r18360803;
}

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 r18360804, r18360805, r18360806, r18360807, r18360808, r18360809, r18360810, r18360811, r18360812, r18360813, r18360814, r18360815, r18360816, r18360817;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r18360804);
        mpfr_init(r18360805);
        mpfr_init(r18360806);
        mpfr_init(r18360807);
        mpfr_init(r18360808);
        mpfr_init(r18360809);
        mpfr_init(r18360810);
        mpfr_init(r18360811);
        mpfr_init(r18360812);
        mpfr_init(r18360813);
        mpfr_init(r18360814);
        mpfr_init(r18360815);
        mpfr_init(r18360816);
        mpfr_init(r18360817);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r18360804, lambda1, MPFR_RNDN);
        mpfr_set_d(r18360805, phi2, MPFR_RNDN);
        mpfr_cos(r18360806, r18360805, MPFR_RNDN);
        mpfr_set_d(r18360807, lambda2, MPFR_RNDN);
        mpfr_sub(r18360808, r18360804, r18360807, MPFR_RNDN);
        mpfr_sin(r18360809, r18360808, MPFR_RNDN);
        mpfr_mul(r18360810, r18360806, r18360809, MPFR_RNDN);
        mpfr_set_d(r18360811, phi1, MPFR_RNDN);
        mpfr_cos(r18360812, r18360811, MPFR_RNDN);
        mpfr_cos(r18360813, r18360808, MPFR_RNDN);
        mpfr_mul(r18360814, r18360806, r18360813, MPFR_RNDN);
        mpfr_add(r18360815, r18360812, r18360814, MPFR_RNDN);
        mpfr_atan2(r18360816, r18360810, r18360815, MPFR_RNDN);
        mpfr_add(r18360817, r18360804, r18360816, MPFR_RNDN);
        return mpfr_get_d(r18360817, MPFR_RNDN);
}

static mpfr_t r18360818, r18360819, r18360820, r18360821, r18360822, r18360823, r18360824, r18360825, r18360826, r18360827, r18360828, r18360829, r18360830, r18360831, r18360832, r18360833, r18360834, r18360835, r18360836, r18360837, r18360838, r18360839, r18360840, r18360841;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r18360818);
        mpfr_init(r18360819);
        mpfr_init(r18360820);
        mpfr_init(r18360821);
        mpfr_init(r18360822);
        mpfr_init(r18360823);
        mpfr_init(r18360824);
        mpfr_init(r18360825);
        mpfr_init(r18360826);
        mpfr_init(r18360827);
        mpfr_init(r18360828);
        mpfr_init(r18360829);
        mpfr_init(r18360830);
        mpfr_init(r18360831);
        mpfr_init(r18360832);
        mpfr_init(r18360833);
        mpfr_init(r18360834);
        mpfr_init(r18360835);
        mpfr_init(r18360836);
        mpfr_init(r18360837);
        mpfr_init(r18360838);
        mpfr_init(r18360839);
        mpfr_init(r18360840);
        mpfr_init(r18360841);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r18360818, lambda1, MPFR_RNDN);
        mpfr_set_d(r18360819, phi2, MPFR_RNDN);
        mpfr_cos(r18360820, r18360819, MPFR_RNDN);
        mpfr_sin(r18360821, r18360818, MPFR_RNDN);
        mpfr_set_d(r18360822, lambda2, MPFR_RNDN);
        mpfr_cos(r18360823, r18360822, MPFR_RNDN);
        mpfr_mul(r18360824, r18360821, r18360823, MPFR_RNDN);
        mpfr_cos(r18360825, r18360818, MPFR_RNDN);
        mpfr_neg(r18360826, r18360822, MPFR_RNDN);
        mpfr_sin(r18360827, r18360826, MPFR_RNDN);
        mpfr_mul(r18360828, r18360825, r18360827, MPFR_RNDN);
        mpfr_add(r18360829, r18360824, r18360828, MPFR_RNDN);
        mpfr_mul(r18360830, r18360820, r18360829, MPFR_RNDN);
        mpfr_set_d(r18360831, phi1, MPFR_RNDN);
        mpfr_cos(r18360832, r18360831, MPFR_RNDN);
        mpfr_mul(r18360833, r18360825, r18360823, MPFR_RNDN);
        mpfr_mul(r18360834, r18360820, r18360833, MPFR_RNDN);
        mpfr_add(r18360835, r18360832, r18360834, MPFR_RNDN);
        mpfr_sin(r18360836, r18360822, MPFR_RNDN);
        mpfr_mul(r18360837, r18360821, r18360836, MPFR_RNDN);
        mpfr_mul(r18360838, r18360820, r18360837, MPFR_RNDN);
        mpfr_add(r18360839, r18360835, r18360838, MPFR_RNDN);
        mpfr_atan2(r18360840, r18360830, r18360839, MPFR_RNDN);
        mpfr_add(r18360841, r18360818, r18360840, MPFR_RNDN);
        return mpfr_get_d(r18360841, MPFR_RNDN);
}

static mpfr_t r18360842, r18360843, r18360844, r18360845, r18360846, r18360847, r18360848, r18360849, r18360850, r18360851, r18360852, r18360853, r18360854, r18360855, r18360856, r18360857, r18360858, r18360859, r18360860, r18360861, r18360862, r18360863, r18360864, r18360865;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r18360842);
        mpfr_init(r18360843);
        mpfr_init(r18360844);
        mpfr_init(r18360845);
        mpfr_init(r18360846);
        mpfr_init(r18360847);
        mpfr_init(r18360848);
        mpfr_init(r18360849);
        mpfr_init(r18360850);
        mpfr_init(r18360851);
        mpfr_init(r18360852);
        mpfr_init(r18360853);
        mpfr_init(r18360854);
        mpfr_init(r18360855);
        mpfr_init(r18360856);
        mpfr_init(r18360857);
        mpfr_init(r18360858);
        mpfr_init(r18360859);
        mpfr_init(r18360860);
        mpfr_init(r18360861);
        mpfr_init(r18360862);
        mpfr_init(r18360863);
        mpfr_init(r18360864);
        mpfr_init(r18360865);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r18360842, lambda1, MPFR_RNDN);
        mpfr_set_d(r18360843, phi2, MPFR_RNDN);
        mpfr_cos(r18360844, r18360843, MPFR_RNDN);
        mpfr_sin(r18360845, r18360842, MPFR_RNDN);
        mpfr_set_d(r18360846, lambda2, MPFR_RNDN);
        mpfr_cos(r18360847, r18360846, MPFR_RNDN);
        mpfr_mul(r18360848, r18360845, r18360847, MPFR_RNDN);
        mpfr_cos(r18360849, r18360842, MPFR_RNDN);
        mpfr_neg(r18360850, r18360846, MPFR_RNDN);
        mpfr_sin(r18360851, r18360850, MPFR_RNDN);
        mpfr_mul(r18360852, r18360849, r18360851, MPFR_RNDN);
        mpfr_add(r18360853, r18360848, r18360852, MPFR_RNDN);
        mpfr_mul(r18360854, r18360844, r18360853, MPFR_RNDN);
        mpfr_set_d(r18360855, phi1, MPFR_RNDN);
        mpfr_cos(r18360856, r18360855, MPFR_RNDN);
        mpfr_mul(r18360857, r18360849, r18360847, MPFR_RNDN);
        mpfr_mul(r18360858, r18360844, r18360857, MPFR_RNDN);
        mpfr_add(r18360859, r18360856, r18360858, MPFR_RNDN);
        mpfr_sin(r18360860, r18360846, MPFR_RNDN);
        mpfr_mul(r18360861, r18360845, r18360860, MPFR_RNDN);
        mpfr_mul(r18360862, r18360844, r18360861, MPFR_RNDN);
        mpfr_add(r18360863, r18360859, r18360862, MPFR_RNDN);
        mpfr_atan2(r18360864, r18360854, r18360863, MPFR_RNDN);
        mpfr_add(r18360865, r18360842, r18360864, MPFR_RNDN);
        return mpfr_get_d(r18360865, MPFR_RNDN);
}

