#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 r8713 = lambda1;
        float r8714 = phi2;
        float r8715 = cos(r8714);
        float r8716 = lambda2;
        float r8717 = r8713 - r8716;
        float r8718 = sin(r8717);
        float r8719 = r8715 * r8718;
        float r8720 = phi1;
        float r8721 = cos(r8720);
        float r8722 = cos(r8717);
        float r8723 = r8715 * r8722;
        float r8724 = r8721 + r8723;
        float r8725 = atan2(r8719, r8724);
        float r8726 = r8713 + r8725;
        return r8726;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r8727 = lambda1;
        double r8728 = phi2;
        double r8729 = cos(r8728);
        double r8730 = lambda2;
        double r8731 = r8727 - r8730;
        double r8732 = sin(r8731);
        double r8733 = r8729 * r8732;
        double r8734 = phi1;
        double r8735 = cos(r8734);
        double r8736 = cos(r8731);
        double r8737 = r8729 * r8736;
        double r8738 = r8735 + r8737;
        double r8739 = atan2(r8733, r8738);
        double r8740 = r8727 + r8739;
        return r8740;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r8741 = phi2;
        float r8742 = cos(r8741);
        float r8743 = lambda1;
        float r8744 = sin(r8743);
        float r8745 = lambda2;
        float r8746 = cos(r8745);
        float r8747 = r8744 * r8746;
        float r8748 = cos(r8743);
        float r8749 = -r8745;
        float r8750 = sin(r8749);
        float r8751 = r8748 * r8750;
        float r8752 = r8747 + r8751;
        float r8753 = r8742 * r8752;
        float r8754 = sin(r8745);
        float r8755 = r8754 * r8744;
        float r8756 = fma(r8748, r8746, r8755);
        float r8757 = phi1;
        float r8758 = cos(r8757);
        float r8759 = fma(r8756, r8742, r8758);
        float r8760 = exp(r8759);
        float r8761 = log(r8760);
        float r8762 = atan2(r8753, r8761);
        float r8763 = r8762 + r8743;
        return r8763;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r8764 = phi2;
        double r8765 = cos(r8764);
        double r8766 = lambda1;
        double r8767 = sin(r8766);
        double r8768 = lambda2;
        double r8769 = cos(r8768);
        double r8770 = r8767 * r8769;
        double r8771 = cos(r8766);
        double r8772 = -r8768;
        double r8773 = sin(r8772);
        double r8774 = r8771 * r8773;
        double r8775 = r8770 + r8774;
        double r8776 = r8765 * r8775;
        double r8777 = sin(r8768);
        double r8778 = r8777 * r8767;
        double r8779 = fma(r8771, r8769, r8778);
        double r8780 = phi1;
        double r8781 = cos(r8780);
        double r8782 = fma(r8779, r8765, r8781);
        double r8783 = exp(r8782);
        double r8784 = log(r8783);
        double r8785 = atan2(r8776, r8784);
        double r8786 = r8785 + r8766;
        return r8786;
}

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 r8787, r8788, r8789, r8790, r8791, r8792, r8793, r8794, r8795, r8796, r8797, r8798, r8799, r8800;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8787);
        mpfr_init(r8788);
        mpfr_init(r8789);
        mpfr_init(r8790);
        mpfr_init(r8791);
        mpfr_init(r8792);
        mpfr_init(r8793);
        mpfr_init(r8794);
        mpfr_init(r8795);
        mpfr_init(r8796);
        mpfr_init(r8797);
        mpfr_init(r8798);
        mpfr_init(r8799);
        mpfr_init(r8800);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8787, lambda1, MPFR_RNDN);
        mpfr_set_d(r8788, phi2, MPFR_RNDN);
        mpfr_cos(r8789, r8788, MPFR_RNDN);
        mpfr_set_d(r8790, lambda2, MPFR_RNDN);
        mpfr_sub(r8791, r8787, r8790, MPFR_RNDN);
        mpfr_sin(r8792, r8791, MPFR_RNDN);
        mpfr_mul(r8793, r8789, r8792, MPFR_RNDN);
        mpfr_set_d(r8794, phi1, MPFR_RNDN);
        mpfr_cos(r8795, r8794, MPFR_RNDN);
        mpfr_cos(r8796, r8791, MPFR_RNDN);
        mpfr_mul(r8797, r8789, r8796, MPFR_RNDN);
        mpfr_add(r8798, r8795, r8797, MPFR_RNDN);
        mpfr_atan2(r8799, r8793, r8798, MPFR_RNDN);
        mpfr_add(r8800, r8787, r8799, MPFR_RNDN);
        return mpfr_get_d(r8800, MPFR_RNDN);
}

static mpfr_t r8801, r8802, r8803, r8804, r8805, r8806, r8807, r8808, r8809, r8810, r8811, r8812, r8813, r8814, r8815, r8816, r8817, r8818, r8819, r8820, r8821, r8822, r8823;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8801);
        mpfr_init(r8802);
        mpfr_init(r8803);
        mpfr_init(r8804);
        mpfr_init(r8805);
        mpfr_init(r8806);
        mpfr_init(r8807);
        mpfr_init(r8808);
        mpfr_init(r8809);
        mpfr_init(r8810);
        mpfr_init(r8811);
        mpfr_init(r8812);
        mpfr_init(r8813);
        mpfr_init(r8814);
        mpfr_init(r8815);
        mpfr_init(r8816);
        mpfr_init(r8817);
        mpfr_init(r8818);
        mpfr_init(r8819);
        mpfr_init(r8820);
        mpfr_init(r8821);
        mpfr_init(r8822);
        mpfr_init(r8823);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8801, phi2, MPFR_RNDN);
        mpfr_cos(r8802, r8801, MPFR_RNDN);
        mpfr_set_d(r8803, lambda1, MPFR_RNDN);
        mpfr_sin(r8804, r8803, MPFR_RNDN);
        mpfr_set_d(r8805, lambda2, MPFR_RNDN);
        mpfr_cos(r8806, r8805, MPFR_RNDN);
        mpfr_mul(r8807, r8804, r8806, MPFR_RNDN);
        mpfr_cos(r8808, r8803, MPFR_RNDN);
        mpfr_neg(r8809, r8805, MPFR_RNDN);
        mpfr_sin(r8810, r8809, MPFR_RNDN);
        mpfr_mul(r8811, r8808, r8810, MPFR_RNDN);
        mpfr_add(r8812, r8807, r8811, MPFR_RNDN);
        mpfr_mul(r8813, r8802, r8812, MPFR_RNDN);
        mpfr_sin(r8814, r8805, MPFR_RNDN);
        mpfr_mul(r8815, r8814, r8804, MPFR_RNDN);
        mpfr_fma(r8816, r8808, r8806, r8815, MPFR_RNDN);
        mpfr_set_d(r8817, phi1, MPFR_RNDN);
        mpfr_cos(r8818, r8817, MPFR_RNDN);
        mpfr_fma(r8819, r8816, r8802, r8818, MPFR_RNDN);
        mpfr_exp(r8820, r8819, MPFR_RNDN);
        mpfr_log(r8821, r8820, MPFR_RNDN);
        mpfr_atan2(r8822, r8813, r8821, MPFR_RNDN);
        mpfr_add(r8823, r8822, r8803, MPFR_RNDN);
        return mpfr_get_d(r8823, MPFR_RNDN);
}

static mpfr_t r8824, r8825, r8826, r8827, r8828, r8829, r8830, r8831, r8832, r8833, r8834, r8835, r8836, r8837, r8838, r8839, r8840, r8841, r8842, r8843, r8844, r8845, r8846;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8824);
        mpfr_init(r8825);
        mpfr_init(r8826);
        mpfr_init(r8827);
        mpfr_init(r8828);
        mpfr_init(r8829);
        mpfr_init(r8830);
        mpfr_init(r8831);
        mpfr_init(r8832);
        mpfr_init(r8833);
        mpfr_init(r8834);
        mpfr_init(r8835);
        mpfr_init(r8836);
        mpfr_init(r8837);
        mpfr_init(r8838);
        mpfr_init(r8839);
        mpfr_init(r8840);
        mpfr_init(r8841);
        mpfr_init(r8842);
        mpfr_init(r8843);
        mpfr_init(r8844);
        mpfr_init(r8845);
        mpfr_init(r8846);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8824, phi2, MPFR_RNDN);
        mpfr_cos(r8825, r8824, MPFR_RNDN);
        mpfr_set_d(r8826, lambda1, MPFR_RNDN);
        mpfr_sin(r8827, r8826, MPFR_RNDN);
        mpfr_set_d(r8828, lambda2, MPFR_RNDN);
        mpfr_cos(r8829, r8828, MPFR_RNDN);
        mpfr_mul(r8830, r8827, r8829, MPFR_RNDN);
        mpfr_cos(r8831, r8826, MPFR_RNDN);
        mpfr_neg(r8832, r8828, MPFR_RNDN);
        mpfr_sin(r8833, r8832, MPFR_RNDN);
        mpfr_mul(r8834, r8831, r8833, MPFR_RNDN);
        mpfr_add(r8835, r8830, r8834, MPFR_RNDN);
        mpfr_mul(r8836, r8825, r8835, MPFR_RNDN);
        mpfr_sin(r8837, r8828, MPFR_RNDN);
        mpfr_mul(r8838, r8837, r8827, MPFR_RNDN);
        mpfr_fma(r8839, r8831, r8829, r8838, MPFR_RNDN);
        mpfr_set_d(r8840, phi1, MPFR_RNDN);
        mpfr_cos(r8841, r8840, MPFR_RNDN);
        mpfr_fma(r8842, r8839, r8825, r8841, MPFR_RNDN);
        mpfr_exp(r8843, r8842, MPFR_RNDN);
        mpfr_log(r8844, r8843, MPFR_RNDN);
        mpfr_atan2(r8845, r8836, r8844, MPFR_RNDN);
        mpfr_add(r8846, r8845, r8826, MPFR_RNDN);
        return mpfr_get_d(r8846, MPFR_RNDN);
}

