#include <tgmath.h>
#include <gmp.h>
#include <mpfr.h>
#include <stdio.h>
#include <stdbool.h>

char *name = "Distance on a great circle";

double f_if(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r25493 = R;
        float r25494 = 2;
        float r25495 = phi1;
        float r25496 = phi2;
        float r25497 = r25495 - r25496;
        float r25498 = r25497 / r25494;
        float r25499 = sin(r25498);
        float r25500 = pow(r25499, r25494);
        float r25501 = cos(r25495);
        float r25502 = cos(r25496);
        float r25503 = r25501 * r25502;
        float r25504 = lambda1;
        float r25505 = lambda2;
        float r25506 = r25504 - r25505;
        float r25507 = r25506 / r25494;
        float r25508 = sin(r25507);
        float r25509 = r25503 * r25508;
        float r25510 = r25509 * r25508;
        float r25511 = r25500 + r25510;
        float r25512 = sqrt(r25511);
        float r25513 = 1;
        float r25514 = r25513 - r25511;
        float r25515 = sqrt(r25514);
        float r25516 = atan2(r25512, r25515);
        float r25517 = r25494 * r25516;
        float r25518 = r25493 * r25517;
        return r25518;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r25519 = R;
        double r25520 = 2;
        double r25521 = phi1;
        double r25522 = phi2;
        double r25523 = r25521 - r25522;
        double r25524 = r25523 / r25520;
        double r25525 = sin(r25524);
        double r25526 = pow(r25525, r25520);
        double r25527 = cos(r25521);
        double r25528 = cos(r25522);
        double r25529 = r25527 * r25528;
        double r25530 = lambda1;
        double r25531 = lambda2;
        double r25532 = r25530 - r25531;
        double r25533 = r25532 / r25520;
        double r25534 = sin(r25533);
        double r25535 = r25529 * r25534;
        double r25536 = r25535 * r25534;
        double r25537 = r25526 + r25536;
        double r25538 = sqrt(r25537);
        double r25539 = 1;
        double r25540 = r25539 - r25537;
        double r25541 = sqrt(r25540);
        double r25542 = atan2(r25538, r25541);
        double r25543 = r25520 * r25542;
        double r25544 = r25519 * r25543;
        return r25544;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r25545 = phi1;
        float r25546 = phi2;
        float r25547 = r25545 - r25546;
        float r25548 = 2;
        float r25549 = r25547 / r25548;
        float r25550 = sin(r25549);
        float r25551 = r25550 * r25550;
        float r25552 = lambda1;
        float r25553 = lambda2;
        float r25554 = r25552 - r25553;
        float r25555 = r25554 / r25548;
        float r25556 = sin(r25555);
        float r25557 = cos(r25546);
        float r25558 = r25556 * r25557;
        float r25559 = cos(r25545);
        float r25560 = r25556 * r25559;
        float r25561 = r25558 * r25560;
        float r25562 = r25551 + r25561;
        float r25563 = sqrt(r25562);
        float r25564 = cos(r25549);
        float r25565 = r25564 * r25564;
        float r25566 = r25559 * r25557;
        float r25567 = 1/2;
        float r25568 = r25554 * r25567;
        float r25569 = sin(r25568);
        float r25570 = r25566 * r25569;
        float r25571 = r25570 * r25556;
        float r25572 = r25565 - r25571;
        float r25573 = sqrt(r25572);
        float r25574 = atan2(r25563, r25573);
        float r25575 = R;
        float r25576 = r25548 * r25575;
        float r25577 = r25574 * r25576;
        return r25577;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r25578 = phi1;
        double r25579 = phi2;
        double r25580 = r25578 - r25579;
        double r25581 = 2;
        double r25582 = r25580 / r25581;
        double r25583 = sin(r25582);
        double r25584 = r25583 * r25583;
        double r25585 = lambda1;
        double r25586 = lambda2;
        double r25587 = r25585 - r25586;
        double r25588 = r25587 / r25581;
        double r25589 = sin(r25588);
        double r25590 = cos(r25579);
        double r25591 = r25589 * r25590;
        double r25592 = cos(r25578);
        double r25593 = r25589 * r25592;
        double r25594 = r25591 * r25593;
        double r25595 = r25584 + r25594;
        double r25596 = sqrt(r25595);
        double r25597 = cos(r25582);
        double r25598 = r25597 * r25597;
        double r25599 = r25592 * r25590;
        double r25600 = 1/2;
        double r25601 = r25587 * r25600;
        double r25602 = sin(r25601);
        double r25603 = r25599 * r25602;
        double r25604 = r25603 * r25589;
        double r25605 = r25598 - r25604;
        double r25606 = sqrt(r25605);
        double r25607 = atan2(r25596, r25606);
        double r25608 = R;
        double r25609 = r25581 * r25608;
        double r25610 = r25607 * r25609;
        return r25610;
}

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 r25611, r25612, r25613, r25614, r25615, r25616, r25617, r25618, r25619, r25620, r25621, r25622, r25623, r25624, r25625, r25626, r25627, r25628, r25629, r25630, r25631, r25632, r25633, r25634, r25635, r25636;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r25611);
        mpfr_init_set_str(r25612, "2", 10, MPFR_RNDN);
        mpfr_init(r25613);
        mpfr_init(r25614);
        mpfr_init(r25615);
        mpfr_init(r25616);
        mpfr_init(r25617);
        mpfr_init(r25618);
        mpfr_init(r25619);
        mpfr_init(r25620);
        mpfr_init(r25621);
        mpfr_init(r25622);
        mpfr_init(r25623);
        mpfr_init(r25624);
        mpfr_init(r25625);
        mpfr_init(r25626);
        mpfr_init(r25627);
        mpfr_init(r25628);
        mpfr_init(r25629);
        mpfr_init(r25630);
        mpfr_init_set_str(r25631, "1", 10, MPFR_RNDN);
        mpfr_init(r25632);
        mpfr_init(r25633);
        mpfr_init(r25634);
        mpfr_init(r25635);
        mpfr_init(r25636);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r25611, R, MPFR_RNDN);
        ;
        mpfr_set_d(r25613, phi1, MPFR_RNDN);
        mpfr_set_d(r25614, phi2, MPFR_RNDN);
        mpfr_sub(r25615, r25613, r25614, MPFR_RNDN);
        mpfr_div(r25616, r25615, r25612, MPFR_RNDN);
        mpfr_sin(r25617, r25616, MPFR_RNDN);
        mpfr_pow(r25618, r25617, r25612, MPFR_RNDN);
        mpfr_cos(r25619, r25613, MPFR_RNDN);
        mpfr_cos(r25620, r25614, MPFR_RNDN);
        mpfr_mul(r25621, r25619, r25620, MPFR_RNDN);
        mpfr_set_d(r25622, lambda1, MPFR_RNDN);
        mpfr_set_d(r25623, lambda2, MPFR_RNDN);
        mpfr_sub(r25624, r25622, r25623, MPFR_RNDN);
        mpfr_div(r25625, r25624, r25612, MPFR_RNDN);
        mpfr_sin(r25626, r25625, MPFR_RNDN);
        mpfr_mul(r25627, r25621, r25626, MPFR_RNDN);
        mpfr_mul(r25628, r25627, r25626, MPFR_RNDN);
        mpfr_add(r25629, r25618, r25628, MPFR_RNDN);
        mpfr_sqrt(r25630, r25629, MPFR_RNDN);
        ;
        mpfr_sub(r25632, r25631, r25629, MPFR_RNDN);
        mpfr_sqrt(r25633, r25632, MPFR_RNDN);
        mpfr_atan2(r25634, r25630, r25633, MPFR_RNDN);
        mpfr_mul(r25635, r25612, r25634, MPFR_RNDN);
        mpfr_mul(r25636, r25611, r25635, MPFR_RNDN);
        return mpfr_get_d(r25636, MPFR_RNDN);
}

static mpfr_t r25637, r25638, r25639, r25640, r25641, r25642, r25643, r25644, r25645, r25646, r25647, r25648, r25649, r25650, r25651, r25652, r25653, r25654, r25655, r25656, r25657, r25658, r25659, r25660, r25661, r25662, r25663, r25664, r25665, r25666, r25667, r25668, r25669;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r25637);
        mpfr_init(r25638);
        mpfr_init(r25639);
        mpfr_init_set_str(r25640, "2", 10, MPFR_RNDN);
        mpfr_init(r25641);
        mpfr_init(r25642);
        mpfr_init(r25643);
        mpfr_init(r25644);
        mpfr_init(r25645);
        mpfr_init(r25646);
        mpfr_init(r25647);
        mpfr_init(r25648);
        mpfr_init(r25649);
        mpfr_init(r25650);
        mpfr_init(r25651);
        mpfr_init(r25652);
        mpfr_init(r25653);
        mpfr_init(r25654);
        mpfr_init(r25655);
        mpfr_init(r25656);
        mpfr_init(r25657);
        mpfr_init(r25658);
        mpfr_init_set_str(r25659, "1/2", 10, MPFR_RNDN);
        mpfr_init(r25660);
        mpfr_init(r25661);
        mpfr_init(r25662);
        mpfr_init(r25663);
        mpfr_init(r25664);
        mpfr_init(r25665);
        mpfr_init(r25666);
        mpfr_init(r25667);
        mpfr_init(r25668);
        mpfr_init(r25669);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r25637, phi1, MPFR_RNDN);
        mpfr_set_d(r25638, phi2, MPFR_RNDN);
        mpfr_sub(r25639, r25637, r25638, MPFR_RNDN);
        ;
        mpfr_div(r25641, r25639, r25640, MPFR_RNDN);
        mpfr_sin(r25642, r25641, MPFR_RNDN);
        mpfr_mul(r25643, r25642, r25642, MPFR_RNDN);
        mpfr_set_d(r25644, lambda1, MPFR_RNDN);
        mpfr_set_d(r25645, lambda2, MPFR_RNDN);
        mpfr_sub(r25646, r25644, r25645, MPFR_RNDN);
        mpfr_div(r25647, r25646, r25640, MPFR_RNDN);
        mpfr_sin(r25648, r25647, MPFR_RNDN);
        mpfr_cos(r25649, r25638, MPFR_RNDN);
        mpfr_mul(r25650, r25648, r25649, MPFR_RNDN);
        mpfr_cos(r25651, r25637, MPFR_RNDN);
        mpfr_mul(r25652, r25648, r25651, MPFR_RNDN);
        mpfr_mul(r25653, r25650, r25652, MPFR_RNDN);
        mpfr_add(r25654, r25643, r25653, MPFR_RNDN);
        mpfr_sqrt(r25655, r25654, MPFR_RNDN);
        mpfr_cos(r25656, r25641, MPFR_RNDN);
        mpfr_mul(r25657, r25656, r25656, MPFR_RNDN);
        mpfr_mul(r25658, r25651, r25649, MPFR_RNDN);
        ;
        mpfr_mul(r25660, r25646, r25659, MPFR_RNDN);
        mpfr_sin(r25661, r25660, MPFR_RNDN);
        mpfr_mul(r25662, r25658, r25661, MPFR_RNDN);
        mpfr_mul(r25663, r25662, r25648, MPFR_RNDN);
        mpfr_sub(r25664, r25657, r25663, MPFR_RNDN);
        mpfr_sqrt(r25665, r25664, MPFR_RNDN);
        mpfr_atan2(r25666, r25655, r25665, MPFR_RNDN);
        mpfr_set_d(r25667, R, MPFR_RNDN);
        mpfr_mul(r25668, r25640, r25667, MPFR_RNDN);
        mpfr_mul(r25669, r25666, r25668, MPFR_RNDN);
        return mpfr_get_d(r25669, MPFR_RNDN);
}

static mpfr_t r25670, r25671, r25672, r25673, r25674, r25675, r25676, r25677, r25678, r25679, r25680, r25681, r25682, r25683, r25684, r25685, r25686, r25687, r25688, r25689, r25690, r25691, r25692, r25693, r25694, r25695, r25696, r25697, r25698, r25699, r25700, r25701, r25702;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r25670);
        mpfr_init(r25671);
        mpfr_init(r25672);
        mpfr_init_set_str(r25673, "2", 10, MPFR_RNDN);
        mpfr_init(r25674);
        mpfr_init(r25675);
        mpfr_init(r25676);
        mpfr_init(r25677);
        mpfr_init(r25678);
        mpfr_init(r25679);
        mpfr_init(r25680);
        mpfr_init(r25681);
        mpfr_init(r25682);
        mpfr_init(r25683);
        mpfr_init(r25684);
        mpfr_init(r25685);
        mpfr_init(r25686);
        mpfr_init(r25687);
        mpfr_init(r25688);
        mpfr_init(r25689);
        mpfr_init(r25690);
        mpfr_init(r25691);
        mpfr_init_set_str(r25692, "1/2", 10, MPFR_RNDN);
        mpfr_init(r25693);
        mpfr_init(r25694);
        mpfr_init(r25695);
        mpfr_init(r25696);
        mpfr_init(r25697);
        mpfr_init(r25698);
        mpfr_init(r25699);
        mpfr_init(r25700);
        mpfr_init(r25701);
        mpfr_init(r25702);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r25670, phi1, MPFR_RNDN);
        mpfr_set_d(r25671, phi2, MPFR_RNDN);
        mpfr_sub(r25672, r25670, r25671, MPFR_RNDN);
        ;
        mpfr_div(r25674, r25672, r25673, MPFR_RNDN);
        mpfr_sin(r25675, r25674, MPFR_RNDN);
        mpfr_mul(r25676, r25675, r25675, MPFR_RNDN);
        mpfr_set_d(r25677, lambda1, MPFR_RNDN);
        mpfr_set_d(r25678, lambda2, MPFR_RNDN);
        mpfr_sub(r25679, r25677, r25678, MPFR_RNDN);
        mpfr_div(r25680, r25679, r25673, MPFR_RNDN);
        mpfr_sin(r25681, r25680, MPFR_RNDN);
        mpfr_cos(r25682, r25671, MPFR_RNDN);
        mpfr_mul(r25683, r25681, r25682, MPFR_RNDN);
        mpfr_cos(r25684, r25670, MPFR_RNDN);
        mpfr_mul(r25685, r25681, r25684, MPFR_RNDN);
        mpfr_mul(r25686, r25683, r25685, MPFR_RNDN);
        mpfr_add(r25687, r25676, r25686, MPFR_RNDN);
        mpfr_sqrt(r25688, r25687, MPFR_RNDN);
        mpfr_cos(r25689, r25674, MPFR_RNDN);
        mpfr_mul(r25690, r25689, r25689, MPFR_RNDN);
        mpfr_mul(r25691, r25684, r25682, MPFR_RNDN);
        ;
        mpfr_mul(r25693, r25679, r25692, MPFR_RNDN);
        mpfr_sin(r25694, r25693, MPFR_RNDN);
        mpfr_mul(r25695, r25691, r25694, MPFR_RNDN);
        mpfr_mul(r25696, r25695, r25681, MPFR_RNDN);
        mpfr_sub(r25697, r25690, r25696, MPFR_RNDN);
        mpfr_sqrt(r25698, r25697, MPFR_RNDN);
        mpfr_atan2(r25699, r25688, r25698, MPFR_RNDN);
        mpfr_set_d(r25700, R, MPFR_RNDN);
        mpfr_mul(r25701, r25673, r25700, MPFR_RNDN);
        mpfr_mul(r25702, r25699, r25701, MPFR_RNDN);
        return mpfr_get_d(r25702, MPFR_RNDN);
}

