#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 r24860 = lambda1;
        float r24861 = phi2;
        float r24862 = cos(r24861);
        float r24863 = lambda2;
        float r24864 = r24860 - r24863;
        float r24865 = sin(r24864);
        float r24866 = r24862 * r24865;
        float r24867 = phi1;
        float r24868 = cos(r24867);
        float r24869 = cos(r24864);
        float r24870 = r24862 * r24869;
        float r24871 = r24868 + r24870;
        float r24872 = atan2(r24866, r24871);
        float r24873 = r24860 + r24872;
        return r24873;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r24874 = lambda1;
        double r24875 = phi2;
        double r24876 = cos(r24875);
        double r24877 = lambda2;
        double r24878 = r24874 - r24877;
        double r24879 = sin(r24878);
        double r24880 = r24876 * r24879;
        double r24881 = phi1;
        double r24882 = cos(r24881);
        double r24883 = cos(r24878);
        double r24884 = r24876 * r24883;
        double r24885 = r24882 + r24884;
        double r24886 = atan2(r24880, r24885);
        double r24887 = r24874 + r24886;
        return r24887;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r24888 = phi2;
        float r24889 = cos(r24888);
        float r24890 = lambda1;
        float r24891 = lambda2;
        float r24892 = r24890 - r24891;
        float r24893 = sin(r24892);
        float r24894 = r24889 * r24893;
        float r24895 = cos(r24892);
        float r24896 = log1p(r24895);
        float r24897 = expm1(r24896);
        float r24898 = phi1;
        float r24899 = cos(r24898);
        float r24900 = fma(r24889, r24897, r24899);
        float r24901 = atan2(r24894, r24900);
        float r24902 = r24901 + r24890;
        return r24902;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r24903 = phi2;
        double r24904 = cos(r24903);
        double r24905 = lambda1;
        double r24906 = lambda2;
        double r24907 = r24905 - r24906;
        double r24908 = sin(r24907);
        double r24909 = r24904 * r24908;
        double r24910 = cos(r24907);
        double r24911 = log1p(r24910);
        double r24912 = expm1(r24911);
        double r24913 = phi1;
        double r24914 = cos(r24913);
        double r24915 = fma(r24904, r24912, r24914);
        double r24916 = atan2(r24909, r24915);
        double r24917 = r24916 + r24905;
        return r24917;
}

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 r24918, r24919, r24920, r24921, r24922, r24923, r24924, r24925, r24926, r24927, r24928, r24929, r24930, r24931;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r24918);
        mpfr_init(r24919);
        mpfr_init(r24920);
        mpfr_init(r24921);
        mpfr_init(r24922);
        mpfr_init(r24923);
        mpfr_init(r24924);
        mpfr_init(r24925);
        mpfr_init(r24926);
        mpfr_init(r24927);
        mpfr_init(r24928);
        mpfr_init(r24929);
        mpfr_init(r24930);
        mpfr_init(r24931);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r24918, lambda1, MPFR_RNDN);
        mpfr_set_d(r24919, phi2, MPFR_RNDN);
        mpfr_cos(r24920, r24919, MPFR_RNDN);
        mpfr_set_d(r24921, lambda2, MPFR_RNDN);
        mpfr_sub(r24922, r24918, r24921, MPFR_RNDN);
        mpfr_sin(r24923, r24922, MPFR_RNDN);
        mpfr_mul(r24924, r24920, r24923, MPFR_RNDN);
        mpfr_set_d(r24925, phi1, MPFR_RNDN);
        mpfr_cos(r24926, r24925, MPFR_RNDN);
        mpfr_cos(r24927, r24922, MPFR_RNDN);
        mpfr_mul(r24928, r24920, r24927, MPFR_RNDN);
        mpfr_add(r24929, r24926, r24928, MPFR_RNDN);
        mpfr_atan2(r24930, r24924, r24929, MPFR_RNDN);
        mpfr_add(r24931, r24918, r24930, MPFR_RNDN);
        return mpfr_get_d(r24931, MPFR_RNDN);
}

static mpfr_t r24932, r24933, r24934, r24935, r24936, r24937, r24938, r24939, r24940, r24941, r24942, r24943, r24944, r24945, r24946;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r24932);
        mpfr_init(r24933);
        mpfr_init(r24934);
        mpfr_init(r24935);
        mpfr_init(r24936);
        mpfr_init(r24937);
        mpfr_init(r24938);
        mpfr_init(r24939);
        mpfr_init(r24940);
        mpfr_init(r24941);
        mpfr_init(r24942);
        mpfr_init(r24943);
        mpfr_init(r24944);
        mpfr_init(r24945);
        mpfr_init(r24946);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r24932, phi2, MPFR_RNDN);
        mpfr_cos(r24933, r24932, MPFR_RNDN);
        mpfr_set_d(r24934, lambda1, MPFR_RNDN);
        mpfr_set_d(r24935, lambda2, MPFR_RNDN);
        mpfr_sub(r24936, r24934, r24935, MPFR_RNDN);
        mpfr_sin(r24937, r24936, MPFR_RNDN);
        mpfr_mul(r24938, r24933, r24937, MPFR_RNDN);
        mpfr_cos(r24939, r24936, MPFR_RNDN);
        mpfr_log1p(r24940, r24939, MPFR_RNDN);
        mpfr_expm1(r24941, r24940, MPFR_RNDN);
        mpfr_set_d(r24942, phi1, MPFR_RNDN);
        mpfr_cos(r24943, r24942, MPFR_RNDN);
        mpfr_fma(r24944, r24933, r24941, r24943, MPFR_RNDN);
        mpfr_atan2(r24945, r24938, r24944, MPFR_RNDN);
        mpfr_add(r24946, r24945, r24934, MPFR_RNDN);
        return mpfr_get_d(r24946, MPFR_RNDN);
}

static mpfr_t r24947, r24948, r24949, r24950, r24951, r24952, r24953, r24954, r24955, r24956, r24957, r24958, r24959, r24960, r24961;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r24947);
        mpfr_init(r24948);
        mpfr_init(r24949);
        mpfr_init(r24950);
        mpfr_init(r24951);
        mpfr_init(r24952);
        mpfr_init(r24953);
        mpfr_init(r24954);
        mpfr_init(r24955);
        mpfr_init(r24956);
        mpfr_init(r24957);
        mpfr_init(r24958);
        mpfr_init(r24959);
        mpfr_init(r24960);
        mpfr_init(r24961);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r24947, phi2, MPFR_RNDN);
        mpfr_cos(r24948, r24947, MPFR_RNDN);
        mpfr_set_d(r24949, lambda1, MPFR_RNDN);
        mpfr_set_d(r24950, lambda2, MPFR_RNDN);
        mpfr_sub(r24951, r24949, r24950, MPFR_RNDN);
        mpfr_sin(r24952, r24951, MPFR_RNDN);
        mpfr_mul(r24953, r24948, r24952, MPFR_RNDN);
        mpfr_cos(r24954, r24951, MPFR_RNDN);
        mpfr_log1p(r24955, r24954, MPFR_RNDN);
        mpfr_expm1(r24956, r24955, MPFR_RNDN);
        mpfr_set_d(r24957, phi1, MPFR_RNDN);
        mpfr_cos(r24958, r24957, MPFR_RNDN);
        mpfr_fma(r24959, r24948, r24956, r24958, MPFR_RNDN);
        mpfr_atan2(r24960, r24953, r24959, MPFR_RNDN);
        mpfr_add(r24961, r24960, r24949, MPFR_RNDN);
        return mpfr_get_d(r24961, MPFR_RNDN);
}

