#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 r22451 = lambda1;
        float r22452 = phi2;
        float r22453 = cos(r22452);
        float r22454 = lambda2;
        float r22455 = r22451 - r22454;
        float r22456 = sin(r22455);
        float r22457 = r22453 * r22456;
        float r22458 = phi1;
        float r22459 = cos(r22458);
        float r22460 = cos(r22455);
        float r22461 = r22453 * r22460;
        float r22462 = r22459 + r22461;
        float r22463 = atan2(r22457, r22462);
        float r22464 = r22451 + r22463;
        return r22464;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r22465 = lambda1;
        double r22466 = phi2;
        double r22467 = cos(r22466);
        double r22468 = lambda2;
        double r22469 = r22465 - r22468;
        double r22470 = sin(r22469);
        double r22471 = r22467 * r22470;
        double r22472 = phi1;
        double r22473 = cos(r22472);
        double r22474 = cos(r22469);
        double r22475 = r22467 * r22474;
        double r22476 = r22473 + r22475;
        double r22477 = atan2(r22471, r22476);
        double r22478 = r22465 + r22477;
        return r22478;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r22479 = lambda1;
        float r22480 = sin(r22479);
        float r22481 = lambda2;
        float r22482 = cos(r22481);
        float r22483 = r22480 * r22482;
        float r22484 = cos(r22479);
        float r22485 = sin(r22481);
        float r22486 = r22484 * r22485;
        float r22487 = r22483 - r22486;
        float r22488 = phi2;
        float r22489 = cos(r22488);
        float r22490 = r22487 * r22489;
        float r22491 = log1p(r22490);
        float r22492 = expm1(r22491);
        float r22493 = r22484 * r22482;
        float r22494 = -r22481;
        float r22495 = sin(r22494);
        float r22496 = r22480 * r22495;
        float r22497 = r22493 - r22496;
        float r22498 = phi1;
        float r22499 = cos(r22498);
        float r22500 = fma(r22489, r22497, r22499);
        float r22501 = atan2(r22492, r22500);
        float r22502 = r22501 + r22479;
        return r22502;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r22503 = lambda1;
        double r22504 = sin(r22503);
        double r22505 = lambda2;
        double r22506 = cos(r22505);
        double r22507 = r22504 * r22506;
        double r22508 = cos(r22503);
        double r22509 = sin(r22505);
        double r22510 = r22508 * r22509;
        double r22511 = r22507 - r22510;
        double r22512 = phi2;
        double r22513 = cos(r22512);
        double r22514 = r22511 * r22513;
        double r22515 = log1p(r22514);
        double r22516 = expm1(r22515);
        double r22517 = r22508 * r22506;
        double r22518 = -r22505;
        double r22519 = sin(r22518);
        double r22520 = r22504 * r22519;
        double r22521 = r22517 - r22520;
        double r22522 = phi1;
        double r22523 = cos(r22522);
        double r22524 = fma(r22513, r22521, r22523);
        double r22525 = atan2(r22516, r22524);
        double r22526 = r22525 + r22503;
        return r22526;
}

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 r22527, r22528, r22529, r22530, r22531, r22532, r22533, r22534, r22535, r22536, r22537, r22538, r22539, r22540;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r22527);
        mpfr_init(r22528);
        mpfr_init(r22529);
        mpfr_init(r22530);
        mpfr_init(r22531);
        mpfr_init(r22532);
        mpfr_init(r22533);
        mpfr_init(r22534);
        mpfr_init(r22535);
        mpfr_init(r22536);
        mpfr_init(r22537);
        mpfr_init(r22538);
        mpfr_init(r22539);
        mpfr_init(r22540);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r22527, lambda1, MPFR_RNDN);
        mpfr_set_d(r22528, phi2, MPFR_RNDN);
        mpfr_cos(r22529, r22528, MPFR_RNDN);
        mpfr_set_d(r22530, lambda2, MPFR_RNDN);
        mpfr_sub(r22531, r22527, r22530, MPFR_RNDN);
        mpfr_sin(r22532, r22531, MPFR_RNDN);
        mpfr_mul(r22533, r22529, r22532, MPFR_RNDN);
        mpfr_set_d(r22534, phi1, MPFR_RNDN);
        mpfr_cos(r22535, r22534, MPFR_RNDN);
        mpfr_cos(r22536, r22531, MPFR_RNDN);
        mpfr_mul(r22537, r22529, r22536, MPFR_RNDN);
        mpfr_add(r22538, r22535, r22537, MPFR_RNDN);
        mpfr_atan2(r22539, r22533, r22538, MPFR_RNDN);
        mpfr_add(r22540, r22527, r22539, MPFR_RNDN);
        return mpfr_get_d(r22540, MPFR_RNDN);
}

static mpfr_t r22541, r22542, r22543, r22544, r22545, r22546, r22547, r22548, r22549, r22550, r22551, r22552, r22553, r22554, r22555, r22556, r22557, r22558, r22559, r22560, r22561, r22562, r22563, r22564;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r22541);
        mpfr_init(r22542);
        mpfr_init(r22543);
        mpfr_init(r22544);
        mpfr_init(r22545);
        mpfr_init(r22546);
        mpfr_init(r22547);
        mpfr_init(r22548);
        mpfr_init(r22549);
        mpfr_init(r22550);
        mpfr_init(r22551);
        mpfr_init(r22552);
        mpfr_init(r22553);
        mpfr_init(r22554);
        mpfr_init(r22555);
        mpfr_init(r22556);
        mpfr_init(r22557);
        mpfr_init(r22558);
        mpfr_init(r22559);
        mpfr_init(r22560);
        mpfr_init(r22561);
        mpfr_init(r22562);
        mpfr_init(r22563);
        mpfr_init(r22564);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r22541, lambda1, MPFR_RNDN);
        mpfr_sin(r22542, r22541, MPFR_RNDN);
        mpfr_set_d(r22543, lambda2, MPFR_RNDN);
        mpfr_cos(r22544, r22543, MPFR_RNDN);
        mpfr_mul(r22545, r22542, r22544, MPFR_RNDN);
        mpfr_cos(r22546, r22541, MPFR_RNDN);
        mpfr_sin(r22547, r22543, MPFR_RNDN);
        mpfr_mul(r22548, r22546, r22547, MPFR_RNDN);
        mpfr_sub(r22549, r22545, r22548, MPFR_RNDN);
        mpfr_set_d(r22550, phi2, MPFR_RNDN);
        mpfr_cos(r22551, r22550, MPFR_RNDN);
        mpfr_mul(r22552, r22549, r22551, MPFR_RNDN);
        mpfr_log1p(r22553, r22552, MPFR_RNDN);
        mpfr_expm1(r22554, r22553, MPFR_RNDN);
        mpfr_mul(r22555, r22546, r22544, MPFR_RNDN);
        mpfr_neg(r22556, r22543, MPFR_RNDN);
        mpfr_sin(r22557, r22556, MPFR_RNDN);
        mpfr_mul(r22558, r22542, r22557, MPFR_RNDN);
        mpfr_sub(r22559, r22555, r22558, MPFR_RNDN);
        mpfr_set_d(r22560, phi1, MPFR_RNDN);
        mpfr_cos(r22561, r22560, MPFR_RNDN);
        mpfr_fma(r22562, r22551, r22559, r22561, MPFR_RNDN);
        mpfr_atan2(r22563, r22554, r22562, MPFR_RNDN);
        mpfr_add(r22564, r22563, r22541, MPFR_RNDN);
        return mpfr_get_d(r22564, MPFR_RNDN);
}

static mpfr_t r22565, r22566, r22567, r22568, r22569, r22570, r22571, r22572, r22573, r22574, r22575, r22576, r22577, r22578, r22579, r22580, r22581, r22582, r22583, r22584, r22585, r22586, r22587, r22588;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r22565);
        mpfr_init(r22566);
        mpfr_init(r22567);
        mpfr_init(r22568);
        mpfr_init(r22569);
        mpfr_init(r22570);
        mpfr_init(r22571);
        mpfr_init(r22572);
        mpfr_init(r22573);
        mpfr_init(r22574);
        mpfr_init(r22575);
        mpfr_init(r22576);
        mpfr_init(r22577);
        mpfr_init(r22578);
        mpfr_init(r22579);
        mpfr_init(r22580);
        mpfr_init(r22581);
        mpfr_init(r22582);
        mpfr_init(r22583);
        mpfr_init(r22584);
        mpfr_init(r22585);
        mpfr_init(r22586);
        mpfr_init(r22587);
        mpfr_init(r22588);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r22565, lambda1, MPFR_RNDN);
        mpfr_sin(r22566, r22565, MPFR_RNDN);
        mpfr_set_d(r22567, lambda2, MPFR_RNDN);
        mpfr_cos(r22568, r22567, MPFR_RNDN);
        mpfr_mul(r22569, r22566, r22568, MPFR_RNDN);
        mpfr_cos(r22570, r22565, MPFR_RNDN);
        mpfr_sin(r22571, r22567, MPFR_RNDN);
        mpfr_mul(r22572, r22570, r22571, MPFR_RNDN);
        mpfr_sub(r22573, r22569, r22572, MPFR_RNDN);
        mpfr_set_d(r22574, phi2, MPFR_RNDN);
        mpfr_cos(r22575, r22574, MPFR_RNDN);
        mpfr_mul(r22576, r22573, r22575, MPFR_RNDN);
        mpfr_log1p(r22577, r22576, MPFR_RNDN);
        mpfr_expm1(r22578, r22577, MPFR_RNDN);
        mpfr_mul(r22579, r22570, r22568, MPFR_RNDN);
        mpfr_neg(r22580, r22567, MPFR_RNDN);
        mpfr_sin(r22581, r22580, MPFR_RNDN);
        mpfr_mul(r22582, r22566, r22581, MPFR_RNDN);
        mpfr_sub(r22583, r22579, r22582, MPFR_RNDN);
        mpfr_set_d(r22584, phi1, MPFR_RNDN);
        mpfr_cos(r22585, r22584, MPFR_RNDN);
        mpfr_fma(r22586, r22575, r22583, r22585, MPFR_RNDN);
        mpfr_atan2(r22587, r22578, r22586, MPFR_RNDN);
        mpfr_add(r22588, r22587, r22565, MPFR_RNDN);
        return mpfr_get_d(r22588, MPFR_RNDN);
}

