#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 r26432 = lambda1;
        float r26433 = lambda2;
        float r26434 = r26432 - r26433;
        float r26435 = sin(r26434);
        float r26436 = phi2;
        float r26437 = cos(r26436);
        float r26438 = r26435 * r26437;
        float r26439 = phi1;
        float r26440 = cos(r26439);
        float r26441 = sin(r26436);
        float r26442 = r26440 * r26441;
        float r26443 = sin(r26439);
        float r26444 = r26443 * r26437;
        float r26445 = cos(r26434);
        float r26446 = r26444 * r26445;
        float r26447 = r26442 - r26446;
        float r26448 = atan2(r26438, r26447);
        return r26448;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r26449 = lambda1;
        double r26450 = lambda2;
        double r26451 = r26449 - r26450;
        double r26452 = sin(r26451);
        double r26453 = phi2;
        double r26454 = cos(r26453);
        double r26455 = r26452 * r26454;
        double r26456 = phi1;
        double r26457 = cos(r26456);
        double r26458 = sin(r26453);
        double r26459 = r26457 * r26458;
        double r26460 = sin(r26456);
        double r26461 = r26460 * r26454;
        double r26462 = cos(r26451);
        double r26463 = r26461 * r26462;
        double r26464 = r26459 - r26463;
        double r26465 = atan2(r26455, r26464);
        return r26465;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r26466 = lambda1;
        float r26467 = sin(r26466);
        float r26468 = lambda2;
        float r26469 = cos(r26468);
        float r26470 = r26467 * r26469;
        float r26471 = cos(r26466);
        float r26472 = -r26468;
        float r26473 = sin(r26472);
        float r26474 = r26471 * r26473;
        float r26475 = r26470 + r26474;
        float r26476 = phi2;
        float r26477 = cos(r26476);
        float r26478 = r26475 * r26477;
        float r26479 = phi1;
        float r26480 = cos(r26479);
        float r26481 = sin(r26476);
        float r26482 = r26480 * r26481;
        float r26483 = sin(r26479);
        float r26484 = r26483 * r26477;
        float r26485 = r26471 * r26469;
        float r26486 = r26484 * r26485;
        float r26487 = sin(r26468);
        float r26488 = r26467 * r26487;
        float r26489 = r26484 * r26488;
        float r26490 = exp(r26489);
        float r26491 = log(r26490);
        float r26492 = r26486 + r26491;
        float r26493 = r26482 - r26492;
        float r26494 = atan2(r26478, r26493);
        return r26494;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r26495 = lambda1;
        double r26496 = sin(r26495);
        double r26497 = lambda2;
        double r26498 = cos(r26497);
        double r26499 = r26496 * r26498;
        double r26500 = cos(r26495);
        double r26501 = -r26497;
        double r26502 = sin(r26501);
        double r26503 = r26500 * r26502;
        double r26504 = r26499 + r26503;
        double r26505 = phi2;
        double r26506 = cos(r26505);
        double r26507 = r26504 * r26506;
        double r26508 = phi1;
        double r26509 = cos(r26508);
        double r26510 = sin(r26505);
        double r26511 = r26509 * r26510;
        double r26512 = sin(r26508);
        double r26513 = r26512 * r26506;
        double r26514 = r26500 * r26498;
        double r26515 = r26513 * r26514;
        double r26516 = sin(r26497);
        double r26517 = r26496 * r26516;
        double r26518 = r26513 * r26517;
        double r26519 = exp(r26518);
        double r26520 = log(r26519);
        double r26521 = r26515 + r26520;
        double r26522 = r26511 - r26521;
        double r26523 = atan2(r26507, r26522);
        return r26523;
}

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 r26524, r26525, r26526, r26527, r26528, r26529, r26530, r26531, r26532, r26533, r26534, r26535, r26536, r26537, r26538, r26539, r26540;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26524);
        mpfr_init(r26525);
        mpfr_init(r26526);
        mpfr_init(r26527);
        mpfr_init(r26528);
        mpfr_init(r26529);
        mpfr_init(r26530);
        mpfr_init(r26531);
        mpfr_init(r26532);
        mpfr_init(r26533);
        mpfr_init(r26534);
        mpfr_init(r26535);
        mpfr_init(r26536);
        mpfr_init(r26537);
        mpfr_init(r26538);
        mpfr_init(r26539);
        mpfr_init(r26540);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26524, lambda1, MPFR_RNDN);
        mpfr_set_d(r26525, lambda2, MPFR_RNDN);
        mpfr_sub(r26526, r26524, r26525, MPFR_RNDN);
        mpfr_sin(r26527, r26526, MPFR_RNDN);
        mpfr_set_d(r26528, phi2, MPFR_RNDN);
        mpfr_cos(r26529, r26528, MPFR_RNDN);
        mpfr_mul(r26530, r26527, r26529, MPFR_RNDN);
        mpfr_set_d(r26531, phi1, MPFR_RNDN);
        mpfr_cos(r26532, r26531, MPFR_RNDN);
        mpfr_sin(r26533, r26528, MPFR_RNDN);
        mpfr_mul(r26534, r26532, r26533, MPFR_RNDN);
        mpfr_sin(r26535, r26531, MPFR_RNDN);
        mpfr_mul(r26536, r26535, r26529, MPFR_RNDN);
        mpfr_cos(r26537, r26526, MPFR_RNDN);
        mpfr_mul(r26538, r26536, r26537, MPFR_RNDN);
        mpfr_sub(r26539, r26534, r26538, MPFR_RNDN);
        mpfr_atan2(r26540, r26530, r26539, MPFR_RNDN);
        return mpfr_get_d(r26540, MPFR_RNDN);
}

static mpfr_t r26541, r26542, r26543, r26544, r26545, r26546, r26547, r26548, r26549, r26550, r26551, r26552, r26553, r26554, r26555, r26556, r26557, r26558, r26559, r26560, r26561, r26562, r26563, r26564, r26565, r26566, r26567, r26568, r26569;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26541);
        mpfr_init(r26542);
        mpfr_init(r26543);
        mpfr_init(r26544);
        mpfr_init(r26545);
        mpfr_init(r26546);
        mpfr_init(r26547);
        mpfr_init(r26548);
        mpfr_init(r26549);
        mpfr_init(r26550);
        mpfr_init(r26551);
        mpfr_init(r26552);
        mpfr_init(r26553);
        mpfr_init(r26554);
        mpfr_init(r26555);
        mpfr_init(r26556);
        mpfr_init(r26557);
        mpfr_init(r26558);
        mpfr_init(r26559);
        mpfr_init(r26560);
        mpfr_init(r26561);
        mpfr_init(r26562);
        mpfr_init(r26563);
        mpfr_init(r26564);
        mpfr_init(r26565);
        mpfr_init(r26566);
        mpfr_init(r26567);
        mpfr_init(r26568);
        mpfr_init(r26569);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26541, lambda1, MPFR_RNDN);
        mpfr_sin(r26542, r26541, MPFR_RNDN);
        mpfr_set_d(r26543, lambda2, MPFR_RNDN);
        mpfr_cos(r26544, r26543, MPFR_RNDN);
        mpfr_mul(r26545, r26542, r26544, MPFR_RNDN);
        mpfr_cos(r26546, r26541, MPFR_RNDN);
        mpfr_neg(r26547, r26543, MPFR_RNDN);
        mpfr_sin(r26548, r26547, MPFR_RNDN);
        mpfr_mul(r26549, r26546, r26548, MPFR_RNDN);
        mpfr_add(r26550, r26545, r26549, MPFR_RNDN);
        mpfr_set_d(r26551, phi2, MPFR_RNDN);
        mpfr_cos(r26552, r26551, MPFR_RNDN);
        mpfr_mul(r26553, r26550, r26552, MPFR_RNDN);
        mpfr_set_d(r26554, phi1, MPFR_RNDN);
        mpfr_cos(r26555, r26554, MPFR_RNDN);
        mpfr_sin(r26556, r26551, MPFR_RNDN);
        mpfr_mul(r26557, r26555, r26556, MPFR_RNDN);
        mpfr_sin(r26558, r26554, MPFR_RNDN);
        mpfr_mul(r26559, r26558, r26552, MPFR_RNDN);
        mpfr_mul(r26560, r26546, r26544, MPFR_RNDN);
        mpfr_mul(r26561, r26559, r26560, MPFR_RNDN);
        mpfr_sin(r26562, r26543, MPFR_RNDN);
        mpfr_mul(r26563, r26542, r26562, MPFR_RNDN);
        mpfr_mul(r26564, r26559, r26563, MPFR_RNDN);
        mpfr_exp(r26565, r26564, MPFR_RNDN);
        mpfr_log(r26566, r26565, MPFR_RNDN);
        mpfr_add(r26567, r26561, r26566, MPFR_RNDN);
        mpfr_sub(r26568, r26557, r26567, MPFR_RNDN);
        mpfr_atan2(r26569, r26553, r26568, MPFR_RNDN);
        return mpfr_get_d(r26569, MPFR_RNDN);
}

static mpfr_t r26570, r26571, r26572, r26573, r26574, r26575, r26576, r26577, r26578, r26579, r26580, r26581, r26582, r26583, r26584, r26585, r26586, r26587, r26588, r26589, r26590, r26591, r26592, r26593, r26594, r26595, r26596, r26597, r26598;

void setup_mpfr_f_dm() {
        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);
        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);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26570, lambda1, MPFR_RNDN);
        mpfr_sin(r26571, r26570, MPFR_RNDN);
        mpfr_set_d(r26572, lambda2, MPFR_RNDN);
        mpfr_cos(r26573, r26572, MPFR_RNDN);
        mpfr_mul(r26574, r26571, r26573, MPFR_RNDN);
        mpfr_cos(r26575, r26570, MPFR_RNDN);
        mpfr_neg(r26576, r26572, MPFR_RNDN);
        mpfr_sin(r26577, r26576, MPFR_RNDN);
        mpfr_mul(r26578, r26575, r26577, MPFR_RNDN);
        mpfr_add(r26579, r26574, r26578, MPFR_RNDN);
        mpfr_set_d(r26580, phi2, MPFR_RNDN);
        mpfr_cos(r26581, r26580, MPFR_RNDN);
        mpfr_mul(r26582, r26579, r26581, MPFR_RNDN);
        mpfr_set_d(r26583, phi1, MPFR_RNDN);
        mpfr_cos(r26584, r26583, MPFR_RNDN);
        mpfr_sin(r26585, r26580, MPFR_RNDN);
        mpfr_mul(r26586, r26584, r26585, MPFR_RNDN);
        mpfr_sin(r26587, r26583, MPFR_RNDN);
        mpfr_mul(r26588, r26587, r26581, MPFR_RNDN);
        mpfr_mul(r26589, r26575, r26573, MPFR_RNDN);
        mpfr_mul(r26590, r26588, r26589, MPFR_RNDN);
        mpfr_sin(r26591, r26572, MPFR_RNDN);
        mpfr_mul(r26592, r26571, r26591, MPFR_RNDN);
        mpfr_mul(r26593, r26588, r26592, MPFR_RNDN);
        mpfr_exp(r26594, r26593, MPFR_RNDN);
        mpfr_log(r26595, r26594, MPFR_RNDN);
        mpfr_add(r26596, r26590, r26595, MPFR_RNDN);
        mpfr_sub(r26597, r26586, r26596, MPFR_RNDN);
        mpfr_atan2(r26598, r26582, r26597, MPFR_RNDN);
        return mpfr_get_d(r26598, MPFR_RNDN);
}

