#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 r36333 = lambda1;
        float r36334 = lambda2;
        float r36335 = r36333 - r36334;
        float r36336 = sin(r36335);
        float r36337 = phi2;
        float r36338 = cos(r36337);
        float r36339 = r36336 * r36338;
        float r36340 = phi1;
        float r36341 = cos(r36340);
        float r36342 = sin(r36337);
        float r36343 = r36341 * r36342;
        float r36344 = sin(r36340);
        float r36345 = r36344 * r36338;
        float r36346 = cos(r36335);
        float r36347 = r36345 * r36346;
        float r36348 = r36343 - r36347;
        float r36349 = atan2(r36339, r36348);
        return r36349;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r36350 = lambda1;
        double r36351 = lambda2;
        double r36352 = r36350 - r36351;
        double r36353 = sin(r36352);
        double r36354 = phi2;
        double r36355 = cos(r36354);
        double r36356 = r36353 * r36355;
        double r36357 = phi1;
        double r36358 = cos(r36357);
        double r36359 = sin(r36354);
        double r36360 = r36358 * r36359;
        double r36361 = sin(r36357);
        double r36362 = r36361 * r36355;
        double r36363 = cos(r36352);
        double r36364 = r36362 * r36363;
        double r36365 = r36360 - r36364;
        double r36366 = atan2(r36356, r36365);
        return r36366;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r36367 = lambda1;
        float r36368 = sin(r36367);
        float r36369 = lambda2;
        float r36370 = cos(r36369);
        float r36371 = r36368 * r36370;
        float r36372 = cos(r36367);
        float r36373 = -r36369;
        float r36374 = sin(r36373);
        float r36375 = r36372 * r36374;
        float r36376 = r36371 + r36375;
        float r36377 = phi2;
        float r36378 = cos(r36377);
        float r36379 = r36376 * r36378;
        float r36380 = phi1;
        float r36381 = cos(r36380);
        float r36382 = sin(r36377);
        float r36383 = r36381 * r36382;
        float r36384 = sin(r36380);
        float r36385 = r36372 * r36370;
        float r36386 = r36368 * r36374;
        float r36387 = r36385 - r36386;
        float r36388 = r36378 * r36387;
        float r36389 = r36384 * r36388;
        float r36390 = r36383 - r36389;
        float r36391 = atan2(r36379, r36390);
        return r36391;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r36392 = lambda1;
        double r36393 = sin(r36392);
        double r36394 = lambda2;
        double r36395 = cos(r36394);
        double r36396 = r36393 * r36395;
        double r36397 = cos(r36392);
        double r36398 = -r36394;
        double r36399 = sin(r36398);
        double r36400 = r36397 * r36399;
        double r36401 = r36396 + r36400;
        double r36402 = phi2;
        double r36403 = cos(r36402);
        double r36404 = r36401 * r36403;
        double r36405 = phi1;
        double r36406 = cos(r36405);
        double r36407 = sin(r36402);
        double r36408 = r36406 * r36407;
        double r36409 = sin(r36405);
        double r36410 = r36397 * r36395;
        double r36411 = r36393 * r36399;
        double r36412 = r36410 - r36411;
        double r36413 = r36403 * r36412;
        double r36414 = r36409 * r36413;
        double r36415 = r36408 - r36414;
        double r36416 = atan2(r36404, r36415);
        return r36416;
}

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 r36417, r36418, r36419, r36420, r36421, r36422, r36423, r36424, r36425, r36426, r36427, r36428, r36429, r36430, r36431, r36432, r36433;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36417);
        mpfr_init(r36418);
        mpfr_init(r36419);
        mpfr_init(r36420);
        mpfr_init(r36421);
        mpfr_init(r36422);
        mpfr_init(r36423);
        mpfr_init(r36424);
        mpfr_init(r36425);
        mpfr_init(r36426);
        mpfr_init(r36427);
        mpfr_init(r36428);
        mpfr_init(r36429);
        mpfr_init(r36430);
        mpfr_init(r36431);
        mpfr_init(r36432);
        mpfr_init(r36433);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36417, lambda1, MPFR_RNDN);
        mpfr_set_d(r36418, lambda2, MPFR_RNDN);
        mpfr_sub(r36419, r36417, r36418, MPFR_RNDN);
        mpfr_sin(r36420, r36419, MPFR_RNDN);
        mpfr_set_d(r36421, phi2, MPFR_RNDN);
        mpfr_cos(r36422, r36421, MPFR_RNDN);
        mpfr_mul(r36423, r36420, r36422, MPFR_RNDN);
        mpfr_set_d(r36424, phi1, MPFR_RNDN);
        mpfr_cos(r36425, r36424, MPFR_RNDN);
        mpfr_sin(r36426, r36421, MPFR_RNDN);
        mpfr_mul(r36427, r36425, r36426, MPFR_RNDN);
        mpfr_sin(r36428, r36424, MPFR_RNDN);
        mpfr_mul(r36429, r36428, r36422, MPFR_RNDN);
        mpfr_cos(r36430, r36419, MPFR_RNDN);
        mpfr_mul(r36431, r36429, r36430, MPFR_RNDN);
        mpfr_sub(r36432, r36427, r36431, MPFR_RNDN);
        mpfr_atan2(r36433, r36423, r36432, MPFR_RNDN);
        return mpfr_get_d(r36433, MPFR_RNDN);
}

static mpfr_t r36434, r36435, r36436, r36437, r36438, r36439, r36440, r36441, r36442, r36443, r36444, r36445, r36446, r36447, r36448, r36449, r36450, r36451, r36452, r36453, r36454, r36455, r36456, r36457, r36458;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36434);
        mpfr_init(r36435);
        mpfr_init(r36436);
        mpfr_init(r36437);
        mpfr_init(r36438);
        mpfr_init(r36439);
        mpfr_init(r36440);
        mpfr_init(r36441);
        mpfr_init(r36442);
        mpfr_init(r36443);
        mpfr_init(r36444);
        mpfr_init(r36445);
        mpfr_init(r36446);
        mpfr_init(r36447);
        mpfr_init(r36448);
        mpfr_init(r36449);
        mpfr_init(r36450);
        mpfr_init(r36451);
        mpfr_init(r36452);
        mpfr_init(r36453);
        mpfr_init(r36454);
        mpfr_init(r36455);
        mpfr_init(r36456);
        mpfr_init(r36457);
        mpfr_init(r36458);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36434, lambda1, MPFR_RNDN);
        mpfr_sin(r36435, r36434, MPFR_RNDN);
        mpfr_set_d(r36436, lambda2, MPFR_RNDN);
        mpfr_cos(r36437, r36436, MPFR_RNDN);
        mpfr_mul(r36438, r36435, r36437, MPFR_RNDN);
        mpfr_cos(r36439, r36434, MPFR_RNDN);
        mpfr_neg(r36440, r36436, MPFR_RNDN);
        mpfr_sin(r36441, r36440, MPFR_RNDN);
        mpfr_mul(r36442, r36439, r36441, MPFR_RNDN);
        mpfr_add(r36443, r36438, r36442, MPFR_RNDN);
        mpfr_set_d(r36444, phi2, MPFR_RNDN);
        mpfr_cos(r36445, r36444, MPFR_RNDN);
        mpfr_mul(r36446, r36443, r36445, MPFR_RNDN);
        mpfr_set_d(r36447, phi1, MPFR_RNDN);
        mpfr_cos(r36448, r36447, MPFR_RNDN);
        mpfr_sin(r36449, r36444, MPFR_RNDN);
        mpfr_mul(r36450, r36448, r36449, MPFR_RNDN);
        mpfr_sin(r36451, r36447, MPFR_RNDN);
        mpfr_mul(r36452, r36439, r36437, MPFR_RNDN);
        mpfr_mul(r36453, r36435, r36441, MPFR_RNDN);
        mpfr_sub(r36454, r36452, r36453, MPFR_RNDN);
        mpfr_mul(r36455, r36445, r36454, MPFR_RNDN);
        mpfr_mul(r36456, r36451, r36455, MPFR_RNDN);
        mpfr_sub(r36457, r36450, r36456, MPFR_RNDN);
        mpfr_atan2(r36458, r36446, r36457, MPFR_RNDN);
        return mpfr_get_d(r36458, MPFR_RNDN);
}

static mpfr_t r36459, r36460, r36461, r36462, r36463, r36464, r36465, r36466, r36467, r36468, r36469, r36470, r36471, r36472, r36473, r36474, r36475, r36476, r36477, r36478, r36479, r36480, r36481, r36482, r36483;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36459);
        mpfr_init(r36460);
        mpfr_init(r36461);
        mpfr_init(r36462);
        mpfr_init(r36463);
        mpfr_init(r36464);
        mpfr_init(r36465);
        mpfr_init(r36466);
        mpfr_init(r36467);
        mpfr_init(r36468);
        mpfr_init(r36469);
        mpfr_init(r36470);
        mpfr_init(r36471);
        mpfr_init(r36472);
        mpfr_init(r36473);
        mpfr_init(r36474);
        mpfr_init(r36475);
        mpfr_init(r36476);
        mpfr_init(r36477);
        mpfr_init(r36478);
        mpfr_init(r36479);
        mpfr_init(r36480);
        mpfr_init(r36481);
        mpfr_init(r36482);
        mpfr_init(r36483);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36459, lambda1, MPFR_RNDN);
        mpfr_sin(r36460, r36459, MPFR_RNDN);
        mpfr_set_d(r36461, lambda2, MPFR_RNDN);
        mpfr_cos(r36462, r36461, MPFR_RNDN);
        mpfr_mul(r36463, r36460, r36462, MPFR_RNDN);
        mpfr_cos(r36464, r36459, MPFR_RNDN);
        mpfr_neg(r36465, r36461, MPFR_RNDN);
        mpfr_sin(r36466, r36465, MPFR_RNDN);
        mpfr_mul(r36467, r36464, r36466, MPFR_RNDN);
        mpfr_add(r36468, r36463, r36467, MPFR_RNDN);
        mpfr_set_d(r36469, phi2, MPFR_RNDN);
        mpfr_cos(r36470, r36469, MPFR_RNDN);
        mpfr_mul(r36471, r36468, r36470, MPFR_RNDN);
        mpfr_set_d(r36472, phi1, MPFR_RNDN);
        mpfr_cos(r36473, r36472, MPFR_RNDN);
        mpfr_sin(r36474, r36469, MPFR_RNDN);
        mpfr_mul(r36475, r36473, r36474, MPFR_RNDN);
        mpfr_sin(r36476, r36472, MPFR_RNDN);
        mpfr_mul(r36477, r36464, r36462, MPFR_RNDN);
        mpfr_mul(r36478, r36460, r36466, MPFR_RNDN);
        mpfr_sub(r36479, r36477, r36478, MPFR_RNDN);
        mpfr_mul(r36480, r36470, r36479, MPFR_RNDN);
        mpfr_mul(r36481, r36476, r36480, MPFR_RNDN);
        mpfr_sub(r36482, r36475, r36481, MPFR_RNDN);
        mpfr_atan2(r36483, r36471, r36482, MPFR_RNDN);
        return mpfr_get_d(r36483, MPFR_RNDN);
}

