#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 r28330 = lambda1;
        float r28331 = phi2;
        float r28332 = cos(r28331);
        float r28333 = lambda2;
        float r28334 = r28330 - r28333;
        float r28335 = sin(r28334);
        float r28336 = r28332 * r28335;
        float r28337 = phi1;
        float r28338 = cos(r28337);
        float r28339 = cos(r28334);
        float r28340 = r28332 * r28339;
        float r28341 = r28338 + r28340;
        float r28342 = atan2(r28336, r28341);
        float r28343 = r28330 + r28342;
        return r28343;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r28344 = lambda1;
        double r28345 = phi2;
        double r28346 = cos(r28345);
        double r28347 = lambda2;
        double r28348 = r28344 - r28347;
        double r28349 = sin(r28348);
        double r28350 = r28346 * r28349;
        double r28351 = phi1;
        double r28352 = cos(r28351);
        double r28353 = cos(r28348);
        double r28354 = r28346 * r28353;
        double r28355 = r28352 + r28354;
        double r28356 = atan2(r28350, r28355);
        double r28357 = r28344 + r28356;
        return r28357;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r28358 = lambda1;
        float r28359 = phi2;
        float r28360 = cos(r28359);
        float r28361 = lambda2;
        float r28362 = r28358 - r28361;
        float r28363 = sin(r28362);
        float r28364 = r28360 * r28363;
        float r28365 = phi1;
        float r28366 = cos(r28365);
        float r28367 = 3;
        float r28368 = pow(r28366, r28367);
        float r28369 = cos(r28362);
        float r28370 = r28360 * r28369;
        float r28371 = pow(r28370, r28367);
        float r28372 = r28368 + r28371;
        float r28373 = r28366 * r28366;
        float r28374 = r28370 * r28370;
        float r28375 = r28366 * r28370;
        float r28376 = r28374 - r28375;
        float r28377 = r28373 + r28376;
        float r28378 = r28372 / r28377;
        float r28379 = atan2(r28364, r28378);
        float r28380 = r28358 + r28379;
        return r28380;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r28381 = lambda1;
        double r28382 = phi2;
        double r28383 = cos(r28382);
        double r28384 = lambda2;
        double r28385 = r28381 - r28384;
        double r28386 = sin(r28385);
        double r28387 = r28383 * r28386;
        double r28388 = phi1;
        double r28389 = cos(r28388);
        double r28390 = 3;
        double r28391 = pow(r28389, r28390);
        double r28392 = cos(r28385);
        double r28393 = r28383 * r28392;
        double r28394 = pow(r28393, r28390);
        double r28395 = r28391 + r28394;
        double r28396 = r28389 * r28389;
        double r28397 = r28393 * r28393;
        double r28398 = r28389 * r28393;
        double r28399 = r28397 - r28398;
        double r28400 = r28396 + r28399;
        double r28401 = r28395 / r28400;
        double r28402 = atan2(r28387, r28401);
        double r28403 = r28381 + r28402;
        return r28403;
}

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 r28404, r28405, r28406, r28407, r28408, r28409, r28410, r28411, r28412, r28413, r28414, r28415, r28416, r28417;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r28404);
        mpfr_init(r28405);
        mpfr_init(r28406);
        mpfr_init(r28407);
        mpfr_init(r28408);
        mpfr_init(r28409);
        mpfr_init(r28410);
        mpfr_init(r28411);
        mpfr_init(r28412);
        mpfr_init(r28413);
        mpfr_init(r28414);
        mpfr_init(r28415);
        mpfr_init(r28416);
        mpfr_init(r28417);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r28404, lambda1, MPFR_RNDN);
        mpfr_set_d(r28405, phi2, MPFR_RNDN);
        mpfr_cos(r28406, r28405, MPFR_RNDN);
        mpfr_set_d(r28407, lambda2, MPFR_RNDN);
        mpfr_sub(r28408, r28404, r28407, MPFR_RNDN);
        mpfr_sin(r28409, r28408, MPFR_RNDN);
        mpfr_mul(r28410, r28406, r28409, MPFR_RNDN);
        mpfr_set_d(r28411, phi1, MPFR_RNDN);
        mpfr_cos(r28412, r28411, MPFR_RNDN);
        mpfr_cos(r28413, r28408, MPFR_RNDN);
        mpfr_mul(r28414, r28406, r28413, MPFR_RNDN);
        mpfr_add(r28415, r28412, r28414, MPFR_RNDN);
        mpfr_atan2(r28416, r28410, r28415, MPFR_RNDN);
        mpfr_add(r28417, r28404, r28416, MPFR_RNDN);
        return mpfr_get_d(r28417, MPFR_RNDN);
}

static mpfr_t r28418, r28419, r28420, r28421, r28422, r28423, r28424, r28425, r28426, r28427, r28428, r28429, r28430, r28431, r28432, r28433, r28434, r28435, r28436, r28437, r28438, r28439, r28440;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r28418);
        mpfr_init(r28419);
        mpfr_init(r28420);
        mpfr_init(r28421);
        mpfr_init(r28422);
        mpfr_init(r28423);
        mpfr_init(r28424);
        mpfr_init(r28425);
        mpfr_init(r28426);
        mpfr_init_set_str(r28427, "3", 10, MPFR_RNDN);
        mpfr_init(r28428);
        mpfr_init(r28429);
        mpfr_init(r28430);
        mpfr_init(r28431);
        mpfr_init(r28432);
        mpfr_init(r28433);
        mpfr_init(r28434);
        mpfr_init(r28435);
        mpfr_init(r28436);
        mpfr_init(r28437);
        mpfr_init(r28438);
        mpfr_init(r28439);
        mpfr_init(r28440);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r28418, lambda1, MPFR_RNDN);
        mpfr_set_d(r28419, phi2, MPFR_RNDN);
        mpfr_cos(r28420, r28419, MPFR_RNDN);
        mpfr_set_d(r28421, lambda2, MPFR_RNDN);
        mpfr_sub(r28422, r28418, r28421, MPFR_RNDN);
        mpfr_sin(r28423, r28422, MPFR_RNDN);
        mpfr_mul(r28424, r28420, r28423, MPFR_RNDN);
        mpfr_set_d(r28425, phi1, MPFR_RNDN);
        mpfr_cos(r28426, r28425, MPFR_RNDN);
        ;
        mpfr_pow(r28428, r28426, r28427, MPFR_RNDN);
        mpfr_cos(r28429, r28422, MPFR_RNDN);
        mpfr_mul(r28430, r28420, r28429, MPFR_RNDN);
        mpfr_pow(r28431, r28430, r28427, MPFR_RNDN);
        mpfr_add(r28432, r28428, r28431, MPFR_RNDN);
        mpfr_mul(r28433, r28426, r28426, MPFR_RNDN);
        mpfr_mul(r28434, r28430, r28430, MPFR_RNDN);
        mpfr_mul(r28435, r28426, r28430, MPFR_RNDN);
        mpfr_sub(r28436, r28434, r28435, MPFR_RNDN);
        mpfr_add(r28437, r28433, r28436, MPFR_RNDN);
        mpfr_div(r28438, r28432, r28437, MPFR_RNDN);
        mpfr_atan2(r28439, r28424, r28438, MPFR_RNDN);
        mpfr_add(r28440, r28418, r28439, MPFR_RNDN);
        return mpfr_get_d(r28440, MPFR_RNDN);
}

static mpfr_t r28441, r28442, r28443, r28444, r28445, r28446, r28447, r28448, r28449, r28450, r28451, r28452, r28453, r28454, r28455, r28456, r28457, r28458, r28459, r28460, r28461, r28462, r28463;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r28441);
        mpfr_init(r28442);
        mpfr_init(r28443);
        mpfr_init(r28444);
        mpfr_init(r28445);
        mpfr_init(r28446);
        mpfr_init(r28447);
        mpfr_init(r28448);
        mpfr_init(r28449);
        mpfr_init_set_str(r28450, "3", 10, MPFR_RNDN);
        mpfr_init(r28451);
        mpfr_init(r28452);
        mpfr_init(r28453);
        mpfr_init(r28454);
        mpfr_init(r28455);
        mpfr_init(r28456);
        mpfr_init(r28457);
        mpfr_init(r28458);
        mpfr_init(r28459);
        mpfr_init(r28460);
        mpfr_init(r28461);
        mpfr_init(r28462);
        mpfr_init(r28463);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r28441, lambda1, MPFR_RNDN);
        mpfr_set_d(r28442, phi2, MPFR_RNDN);
        mpfr_cos(r28443, r28442, MPFR_RNDN);
        mpfr_set_d(r28444, lambda2, MPFR_RNDN);
        mpfr_sub(r28445, r28441, r28444, MPFR_RNDN);
        mpfr_sin(r28446, r28445, MPFR_RNDN);
        mpfr_mul(r28447, r28443, r28446, MPFR_RNDN);
        mpfr_set_d(r28448, phi1, MPFR_RNDN);
        mpfr_cos(r28449, r28448, MPFR_RNDN);
        ;
        mpfr_pow(r28451, r28449, r28450, MPFR_RNDN);
        mpfr_cos(r28452, r28445, MPFR_RNDN);
        mpfr_mul(r28453, r28443, r28452, MPFR_RNDN);
        mpfr_pow(r28454, r28453, r28450, MPFR_RNDN);
        mpfr_add(r28455, r28451, r28454, MPFR_RNDN);
        mpfr_mul(r28456, r28449, r28449, MPFR_RNDN);
        mpfr_mul(r28457, r28453, r28453, MPFR_RNDN);
        mpfr_mul(r28458, r28449, r28453, MPFR_RNDN);
        mpfr_sub(r28459, r28457, r28458, MPFR_RNDN);
        mpfr_add(r28460, r28456, r28459, MPFR_RNDN);
        mpfr_div(r28461, r28455, r28460, MPFR_RNDN);
        mpfr_atan2(r28462, r28447, r28461, MPFR_RNDN);
        mpfr_add(r28463, r28441, r28462, MPFR_RNDN);
        return mpfr_get_d(r28463, MPFR_RNDN);
}

