#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 r28454 = lambda1;
        float r28455 = phi2;
        float r28456 = cos(r28455);
        float r28457 = lambda2;
        float r28458 = r28454 - r28457;
        float r28459 = sin(r28458);
        float r28460 = r28456 * r28459;
        float r28461 = phi1;
        float r28462 = cos(r28461);
        float r28463 = cos(r28458);
        float r28464 = r28456 * r28463;
        float r28465 = r28462 + r28464;
        float r28466 = atan2(r28460, r28465);
        float r28467 = r28454 + r28466;
        return r28467;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r28468 = lambda1;
        double r28469 = phi2;
        double r28470 = cos(r28469);
        double r28471 = lambda2;
        double r28472 = r28468 - r28471;
        double r28473 = sin(r28472);
        double r28474 = r28470 * r28473;
        double r28475 = phi1;
        double r28476 = cos(r28475);
        double r28477 = cos(r28472);
        double r28478 = r28470 * r28477;
        double r28479 = r28476 + r28478;
        double r28480 = atan2(r28474, r28479);
        double r28481 = r28468 + r28480;
        return r28481;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r28482 = lambda1;
        float r28483 = phi2;
        float r28484 = cos(r28483);
        float r28485 = lambda2;
        float r28486 = r28482 - r28485;
        float r28487 = sin(r28486);
        float r28488 = r28484 * r28487;
        float r28489 = phi1;
        float r28490 = cos(r28489);
        float r28491 = 3;
        float r28492 = pow(r28490, r28491);
        float r28493 = cos(r28486);
        float r28494 = r28484 * r28493;
        float r28495 = pow(r28494, r28491);
        float r28496 = r28492 + r28495;
        float r28497 = r28490 * r28490;
        float r28498 = r28494 * r28494;
        float r28499 = r28490 * r28494;
        float r28500 = r28498 - r28499;
        float r28501 = r28497 + r28500;
        float r28502 = r28496 / r28501;
        float r28503 = atan2(r28488, r28502);
        float r28504 = r28482 + r28503;
        return r28504;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r28505 = lambda1;
        double r28506 = phi2;
        double r28507 = cos(r28506);
        double r28508 = lambda2;
        double r28509 = r28505 - r28508;
        double r28510 = sin(r28509);
        double r28511 = r28507 * r28510;
        double r28512 = phi1;
        double r28513 = cos(r28512);
        double r28514 = 3;
        double r28515 = pow(r28513, r28514);
        double r28516 = cos(r28509);
        double r28517 = r28507 * r28516;
        double r28518 = pow(r28517, r28514);
        double r28519 = r28515 + r28518;
        double r28520 = r28513 * r28513;
        double r28521 = r28517 * r28517;
        double r28522 = r28513 * r28517;
        double r28523 = r28521 - r28522;
        double r28524 = r28520 + r28523;
        double r28525 = r28519 / r28524;
        double r28526 = atan2(r28511, r28525);
        double r28527 = r28505 + r28526;
        return r28527;
}

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 r28528, r28529, r28530, r28531, r28532, r28533, r28534, r28535, r28536, r28537, r28538, r28539, r28540, r28541;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r28528);
        mpfr_init(r28529);
        mpfr_init(r28530);
        mpfr_init(r28531);
        mpfr_init(r28532);
        mpfr_init(r28533);
        mpfr_init(r28534);
        mpfr_init(r28535);
        mpfr_init(r28536);
        mpfr_init(r28537);
        mpfr_init(r28538);
        mpfr_init(r28539);
        mpfr_init(r28540);
        mpfr_init(r28541);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r28528, lambda1, MPFR_RNDN);
        mpfr_set_d(r28529, phi2, MPFR_RNDN);
        mpfr_cos(r28530, r28529, MPFR_RNDN);
        mpfr_set_d(r28531, lambda2, MPFR_RNDN);
        mpfr_sub(r28532, r28528, r28531, MPFR_RNDN);
        mpfr_sin(r28533, r28532, MPFR_RNDN);
        mpfr_mul(r28534, r28530, r28533, MPFR_RNDN);
        mpfr_set_d(r28535, phi1, MPFR_RNDN);
        mpfr_cos(r28536, r28535, MPFR_RNDN);
        mpfr_cos(r28537, r28532, MPFR_RNDN);
        mpfr_mul(r28538, r28530, r28537, MPFR_RNDN);
        mpfr_add(r28539, r28536, r28538, MPFR_RNDN);
        mpfr_atan2(r28540, r28534, r28539, MPFR_RNDN);
        mpfr_add(r28541, r28528, r28540, MPFR_RNDN);
        return mpfr_get_d(r28541, MPFR_RNDN);
}

static mpfr_t r28542, r28543, r28544, r28545, r28546, r28547, r28548, r28549, r28550, r28551, r28552, r28553, r28554, r28555, r28556, r28557, r28558, r28559, r28560, r28561, r28562, r28563, r28564;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r28542);
        mpfr_init(r28543);
        mpfr_init(r28544);
        mpfr_init(r28545);
        mpfr_init(r28546);
        mpfr_init(r28547);
        mpfr_init(r28548);
        mpfr_init(r28549);
        mpfr_init(r28550);
        mpfr_init_set_str(r28551, "3", 10, MPFR_RNDN);
        mpfr_init(r28552);
        mpfr_init(r28553);
        mpfr_init(r28554);
        mpfr_init(r28555);
        mpfr_init(r28556);
        mpfr_init(r28557);
        mpfr_init(r28558);
        mpfr_init(r28559);
        mpfr_init(r28560);
        mpfr_init(r28561);
        mpfr_init(r28562);
        mpfr_init(r28563);
        mpfr_init(r28564);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r28542, lambda1, MPFR_RNDN);
        mpfr_set_d(r28543, phi2, MPFR_RNDN);
        mpfr_cos(r28544, r28543, MPFR_RNDN);
        mpfr_set_d(r28545, lambda2, MPFR_RNDN);
        mpfr_sub(r28546, r28542, r28545, MPFR_RNDN);
        mpfr_sin(r28547, r28546, MPFR_RNDN);
        mpfr_mul(r28548, r28544, r28547, MPFR_RNDN);
        mpfr_set_d(r28549, phi1, MPFR_RNDN);
        mpfr_cos(r28550, r28549, MPFR_RNDN);
        ;
        mpfr_pow(r28552, r28550, r28551, MPFR_RNDN);
        mpfr_cos(r28553, r28546, MPFR_RNDN);
        mpfr_mul(r28554, r28544, r28553, MPFR_RNDN);
        mpfr_pow(r28555, r28554, r28551, MPFR_RNDN);
        mpfr_add(r28556, r28552, r28555, MPFR_RNDN);
        mpfr_mul(r28557, r28550, r28550, MPFR_RNDN);
        mpfr_mul(r28558, r28554, r28554, MPFR_RNDN);
        mpfr_mul(r28559, r28550, r28554, MPFR_RNDN);
        mpfr_sub(r28560, r28558, r28559, MPFR_RNDN);
        mpfr_add(r28561, r28557, r28560, MPFR_RNDN);
        mpfr_div(r28562, r28556, r28561, MPFR_RNDN);
        mpfr_atan2(r28563, r28548, r28562, MPFR_RNDN);
        mpfr_add(r28564, r28542, r28563, MPFR_RNDN);
        return mpfr_get_d(r28564, MPFR_RNDN);
}

static mpfr_t r28565, r28566, r28567, r28568, r28569, r28570, r28571, r28572, r28573, r28574, r28575, r28576, r28577, r28578, r28579, r28580, r28581, r28582, r28583, r28584, r28585, r28586, r28587;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r28565);
        mpfr_init(r28566);
        mpfr_init(r28567);
        mpfr_init(r28568);
        mpfr_init(r28569);
        mpfr_init(r28570);
        mpfr_init(r28571);
        mpfr_init(r28572);
        mpfr_init(r28573);
        mpfr_init_set_str(r28574, "3", 10, MPFR_RNDN);
        mpfr_init(r28575);
        mpfr_init(r28576);
        mpfr_init(r28577);
        mpfr_init(r28578);
        mpfr_init(r28579);
        mpfr_init(r28580);
        mpfr_init(r28581);
        mpfr_init(r28582);
        mpfr_init(r28583);
        mpfr_init(r28584);
        mpfr_init(r28585);
        mpfr_init(r28586);
        mpfr_init(r28587);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r28565, lambda1, MPFR_RNDN);
        mpfr_set_d(r28566, phi2, MPFR_RNDN);
        mpfr_cos(r28567, r28566, MPFR_RNDN);
        mpfr_set_d(r28568, lambda2, MPFR_RNDN);
        mpfr_sub(r28569, r28565, r28568, MPFR_RNDN);
        mpfr_sin(r28570, r28569, MPFR_RNDN);
        mpfr_mul(r28571, r28567, r28570, MPFR_RNDN);
        mpfr_set_d(r28572, phi1, MPFR_RNDN);
        mpfr_cos(r28573, r28572, MPFR_RNDN);
        ;
        mpfr_pow(r28575, r28573, r28574, MPFR_RNDN);
        mpfr_cos(r28576, r28569, MPFR_RNDN);
        mpfr_mul(r28577, r28567, r28576, MPFR_RNDN);
        mpfr_pow(r28578, r28577, r28574, MPFR_RNDN);
        mpfr_add(r28579, r28575, r28578, MPFR_RNDN);
        mpfr_mul(r28580, r28573, r28573, MPFR_RNDN);
        mpfr_mul(r28581, r28577, r28577, MPFR_RNDN);
        mpfr_mul(r28582, r28573, r28577, MPFR_RNDN);
        mpfr_sub(r28583, r28581, r28582, MPFR_RNDN);
        mpfr_add(r28584, r28580, r28583, MPFR_RNDN);
        mpfr_div(r28585, r28579, r28584, MPFR_RNDN);
        mpfr_atan2(r28586, r28571, r28585, MPFR_RNDN);
        mpfr_add(r28587, r28565, r28586, MPFR_RNDN);
        return mpfr_get_d(r28587, MPFR_RNDN);
}

