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

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

double f_if(float lambda1, float lambda2, float phi1, float phi2) {
        float r26480 = lambda1;
        float r26481 = lambda2;
        float r26482 = r26480 - r26481;
        float r26483 = sin(r26482);
        float r26484 = phi2;
        float r26485 = cos(r26484);
        float r26486 = r26483 * r26485;
        float r26487 = phi1;
        float r26488 = cos(r26487);
        float r26489 = sin(r26484);
        float r26490 = r26488 * r26489;
        float r26491 = sin(r26487);
        float r26492 = r26491 * r26485;
        float r26493 = cos(r26482);
        float r26494 = r26492 * r26493;
        float r26495 = r26490 - r26494;
        float r26496 = atan2(r26486, r26495);
        return r26496;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r26497 = lambda1;
        double r26498 = lambda2;
        double r26499 = r26497 - r26498;
        double r26500 = sin(r26499);
        double r26501 = phi2;
        double r26502 = cos(r26501);
        double r26503 = r26500 * r26502;
        double r26504 = phi1;
        double r26505 = cos(r26504);
        double r26506 = sin(r26501);
        double r26507 = r26505 * r26506;
        double r26508 = sin(r26504);
        double r26509 = r26508 * r26502;
        double r26510 = cos(r26499);
        double r26511 = r26509 * r26510;
        double r26512 = r26507 - r26511;
        double r26513 = atan2(r26503, r26512);
        return r26513;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r26514 = lambda1;
        float r26515 = sin(r26514);
        float r26516 = lambda2;
        float r26517 = cos(r26516);
        float r26518 = r26515 * r26517;
        float r26519 = cos(r26514);
        float r26520 = -r26516;
        float r26521 = sin(r26520);
        float r26522 = r26519 * r26521;
        float r26523 = r26518 + r26522;
        float r26524 = phi2;
        float r26525 = cos(r26524);
        float r26526 = r26523 * r26525;
        float r26527 = phi1;
        float r26528 = cos(r26527);
        float r26529 = sin(r26524);
        float r26530 = r26528 * r26529;
        float r26531 = sin(r26527);
        float r26532 = r26525 * r26531;
        float r26533 = exp(r26532);
        float r26534 = r26517 * r26519;
        float r26535 = sin(r26516);
        float r26536 = r26515 * r26535;
        float r26537 = r26534 + r26536;
        float r26538 = pow(r26533, r26537);
        float r26539 = log(r26538);
        float r26540 = r26530 - r26539;
        float r26541 = atan2(r26526, r26540);
        return r26541;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r26542 = lambda1;
        double r26543 = sin(r26542);
        double r26544 = lambda2;
        double r26545 = cos(r26544);
        double r26546 = r26543 * r26545;
        double r26547 = cos(r26542);
        double r26548 = -r26544;
        double r26549 = sin(r26548);
        double r26550 = r26547 * r26549;
        double r26551 = r26546 + r26550;
        double r26552 = phi2;
        double r26553 = cos(r26552);
        double r26554 = r26551 * r26553;
        double r26555 = phi1;
        double r26556 = cos(r26555);
        double r26557 = sin(r26552);
        double r26558 = r26556 * r26557;
        double r26559 = sin(r26555);
        double r26560 = r26553 * r26559;
        double r26561 = exp(r26560);
        double r26562 = r26545 * r26547;
        double r26563 = sin(r26544);
        double r26564 = r26543 * r26563;
        double r26565 = r26562 + r26564;
        double r26566 = pow(r26561, r26565);
        double r26567 = log(r26566);
        double r26568 = r26558 - r26567;
        double r26569 = atan2(r26554, r26568);
        return r26569;
}

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 r26570, r26571, r26572, r26573, r26574, r26575, r26576, r26577, r26578, r26579, r26580, r26581, r26582, r26583, r26584, r26585, r26586;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26570);
        mpfr_init(r26571);
        mpfr_init(r26572);
        mpfr_init(r26573);
        mpfr_init(r26574);
        mpfr_init(r26575);
        mpfr_init(r26576);
        mpfr_init(r26577);
        mpfr_init(r26578);
        mpfr_init(r26579);
        mpfr_init(r26580);
        mpfr_init(r26581);
        mpfr_init(r26582);
        mpfr_init(r26583);
        mpfr_init(r26584);
        mpfr_init(r26585);
        mpfr_init(r26586);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26570, lambda1, MPFR_RNDN);
        mpfr_set_d(r26571, lambda2, MPFR_RNDN);
        mpfr_sub(r26572, r26570, r26571, MPFR_RNDN);
        mpfr_sin(r26573, r26572, MPFR_RNDN);
        mpfr_set_d(r26574, phi2, MPFR_RNDN);
        mpfr_cos(r26575, r26574, MPFR_RNDN);
        mpfr_mul(r26576, r26573, r26575, MPFR_RNDN);
        mpfr_set_d(r26577, phi1, MPFR_RNDN);
        mpfr_cos(r26578, r26577, MPFR_RNDN);
        mpfr_sin(r26579, r26574, MPFR_RNDN);
        mpfr_mul(r26580, r26578, r26579, MPFR_RNDN);
        mpfr_sin(r26581, r26577, MPFR_RNDN);
        mpfr_mul(r26582, r26581, r26575, MPFR_RNDN);
        mpfr_cos(r26583, r26572, MPFR_RNDN);
        mpfr_mul(r26584, r26582, r26583, MPFR_RNDN);
        mpfr_sub(r26585, r26580, r26584, MPFR_RNDN);
        mpfr_atan2(r26586, r26576, r26585, MPFR_RNDN);
        return mpfr_get_d(r26586, MPFR_RNDN);
}

static mpfr_t r26587, r26588, r26589, r26590, r26591, r26592, r26593, r26594, r26595, r26596, r26597, r26598, r26599, r26600, r26601, r26602, r26603, r26604, r26605, r26606, r26607, r26608, r26609, r26610, r26611, r26612, r26613, r26614;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26587);
        mpfr_init(r26588);
        mpfr_init(r26589);
        mpfr_init(r26590);
        mpfr_init(r26591);
        mpfr_init(r26592);
        mpfr_init(r26593);
        mpfr_init(r26594);
        mpfr_init(r26595);
        mpfr_init(r26596);
        mpfr_init(r26597);
        mpfr_init(r26598);
        mpfr_init(r26599);
        mpfr_init(r26600);
        mpfr_init(r26601);
        mpfr_init(r26602);
        mpfr_init(r26603);
        mpfr_init(r26604);
        mpfr_init(r26605);
        mpfr_init(r26606);
        mpfr_init(r26607);
        mpfr_init(r26608);
        mpfr_init(r26609);
        mpfr_init(r26610);
        mpfr_init(r26611);
        mpfr_init(r26612);
        mpfr_init(r26613);
        mpfr_init(r26614);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26587, lambda1, MPFR_RNDN);
        mpfr_sin(r26588, r26587, MPFR_RNDN);
        mpfr_set_d(r26589, lambda2, MPFR_RNDN);
        mpfr_cos(r26590, r26589, MPFR_RNDN);
        mpfr_mul(r26591, r26588, r26590, MPFR_RNDN);
        mpfr_cos(r26592, r26587, MPFR_RNDN);
        mpfr_neg(r26593, r26589, MPFR_RNDN);
        mpfr_sin(r26594, r26593, MPFR_RNDN);
        mpfr_mul(r26595, r26592, r26594, MPFR_RNDN);
        mpfr_add(r26596, r26591, r26595, MPFR_RNDN);
        mpfr_set_d(r26597, phi2, MPFR_RNDN);
        mpfr_cos(r26598, r26597, MPFR_RNDN);
        mpfr_mul(r26599, r26596, r26598, MPFR_RNDN);
        mpfr_set_d(r26600, phi1, MPFR_RNDN);
        mpfr_cos(r26601, r26600, MPFR_RNDN);
        mpfr_sin(r26602, r26597, MPFR_RNDN);
        mpfr_mul(r26603, r26601, r26602, MPFR_RNDN);
        mpfr_sin(r26604, r26600, MPFR_RNDN);
        mpfr_mul(r26605, r26598, r26604, MPFR_RNDN);
        mpfr_exp(r26606, r26605, MPFR_RNDN);
        mpfr_mul(r26607, r26590, r26592, MPFR_RNDN);
        mpfr_sin(r26608, r26589, MPFR_RNDN);
        mpfr_mul(r26609, r26588, r26608, MPFR_RNDN);
        mpfr_add(r26610, r26607, r26609, MPFR_RNDN);
        mpfr_pow(r26611, r26606, r26610, MPFR_RNDN);
        mpfr_log(r26612, r26611, MPFR_RNDN);
        mpfr_sub(r26613, r26603, r26612, MPFR_RNDN);
        mpfr_atan2(r26614, r26599, r26613, MPFR_RNDN);
        return mpfr_get_d(r26614, MPFR_RNDN);
}

static mpfr_t r26615, r26616, r26617, r26618, r26619, r26620, r26621, r26622, r26623, r26624, r26625, r26626, r26627, r26628, r26629, r26630, r26631, r26632, r26633, r26634, r26635, r26636, r26637, r26638, r26639, r26640, r26641, r26642;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26615);
        mpfr_init(r26616);
        mpfr_init(r26617);
        mpfr_init(r26618);
        mpfr_init(r26619);
        mpfr_init(r26620);
        mpfr_init(r26621);
        mpfr_init(r26622);
        mpfr_init(r26623);
        mpfr_init(r26624);
        mpfr_init(r26625);
        mpfr_init(r26626);
        mpfr_init(r26627);
        mpfr_init(r26628);
        mpfr_init(r26629);
        mpfr_init(r26630);
        mpfr_init(r26631);
        mpfr_init(r26632);
        mpfr_init(r26633);
        mpfr_init(r26634);
        mpfr_init(r26635);
        mpfr_init(r26636);
        mpfr_init(r26637);
        mpfr_init(r26638);
        mpfr_init(r26639);
        mpfr_init(r26640);
        mpfr_init(r26641);
        mpfr_init(r26642);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26615, lambda1, MPFR_RNDN);
        mpfr_sin(r26616, r26615, MPFR_RNDN);
        mpfr_set_d(r26617, lambda2, MPFR_RNDN);
        mpfr_cos(r26618, r26617, MPFR_RNDN);
        mpfr_mul(r26619, r26616, r26618, MPFR_RNDN);
        mpfr_cos(r26620, r26615, MPFR_RNDN);
        mpfr_neg(r26621, r26617, MPFR_RNDN);
        mpfr_sin(r26622, r26621, MPFR_RNDN);
        mpfr_mul(r26623, r26620, r26622, MPFR_RNDN);
        mpfr_add(r26624, r26619, r26623, MPFR_RNDN);
        mpfr_set_d(r26625, phi2, MPFR_RNDN);
        mpfr_cos(r26626, r26625, MPFR_RNDN);
        mpfr_mul(r26627, r26624, r26626, MPFR_RNDN);
        mpfr_set_d(r26628, phi1, MPFR_RNDN);
        mpfr_cos(r26629, r26628, MPFR_RNDN);
        mpfr_sin(r26630, r26625, MPFR_RNDN);
        mpfr_mul(r26631, r26629, r26630, MPFR_RNDN);
        mpfr_sin(r26632, r26628, MPFR_RNDN);
        mpfr_mul(r26633, r26626, r26632, MPFR_RNDN);
        mpfr_exp(r26634, r26633, MPFR_RNDN);
        mpfr_mul(r26635, r26618, r26620, MPFR_RNDN);
        mpfr_sin(r26636, r26617, MPFR_RNDN);
        mpfr_mul(r26637, r26616, r26636, MPFR_RNDN);
        mpfr_add(r26638, r26635, r26637, MPFR_RNDN);
        mpfr_pow(r26639, r26634, r26638, MPFR_RNDN);
        mpfr_log(r26640, r26639, MPFR_RNDN);
        mpfr_sub(r26641, r26631, r26640, MPFR_RNDN);
        mpfr_atan2(r26642, r26627, r26641, MPFR_RNDN);
        return mpfr_get_d(r26642, MPFR_RNDN);
}

