#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 r19324 = lambda1;
        float r19325 = lambda2;
        float r19326 = r19324 - r19325;
        float r19327 = sin(r19326);
        float r19328 = phi2;
        float r19329 = cos(r19328);
        float r19330 = r19327 * r19329;
        float r19331 = phi1;
        float r19332 = cos(r19331);
        float r19333 = sin(r19328);
        float r19334 = r19332 * r19333;
        float r19335 = sin(r19331);
        float r19336 = r19335 * r19329;
        float r19337 = cos(r19326);
        float r19338 = r19336 * r19337;
        float r19339 = r19334 - r19338;
        float r19340 = atan2(r19330, r19339);
        return r19340;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r19341 = lambda1;
        double r19342 = lambda2;
        double r19343 = r19341 - r19342;
        double r19344 = sin(r19343);
        double r19345 = phi2;
        double r19346 = cos(r19345);
        double r19347 = r19344 * r19346;
        double r19348 = phi1;
        double r19349 = cos(r19348);
        double r19350 = sin(r19345);
        double r19351 = r19349 * r19350;
        double r19352 = sin(r19348);
        double r19353 = r19352 * r19346;
        double r19354 = cos(r19343);
        double r19355 = r19353 * r19354;
        double r19356 = r19351 - r19355;
        double r19357 = atan2(r19347, r19356);
        return r19357;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r19358 = lambda1;
        float r19359 = sin(r19358);
        float r19360 = lambda2;
        float r19361 = cos(r19360);
        float r19362 = r19359 * r19361;
        float r19363 = cos(r19358);
        float r19364 = -r19360;
        float r19365 = sin(r19364);
        float r19366 = r19363 * r19365;
        float r19367 = r19362 + r19366;
        float r19368 = phi2;
        float r19369 = cos(r19368);
        float r19370 = r19367 * r19369;
        float r19371 = phi1;
        float r19372 = cos(r19371);
        float r19373 = sin(r19368);
        float r19374 = r19372 * r19373;
        float r19375 = sin(r19371);
        float r19376 = r19375 * r19369;
        float r19377 = r19363 * r19361;
        float r19378 = r19359 * (r19359 * r19359);
        float r19379 = r19365 * (r19365 * r19365);
        float r19380 = r19378 * r19379;
        float r19381 = cbrt(r19380);
        float r19382 = r19377 - r19381;
        float r19383 = r19376 * r19382;
        float r19384 = r19374 - r19383;
        float r19385 = atan2(r19370, r19384);
        return r19385;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r19386 = lambda1;
        double r19387 = sin(r19386);
        double r19388 = lambda2;
        double r19389 = cos(r19388);
        double r19390 = r19387 * r19389;
        double r19391 = cos(r19386);
        double r19392 = -r19388;
        double r19393 = sin(r19392);
        double r19394 = r19391 * r19393;
        double r19395 = r19390 + r19394;
        double r19396 = phi2;
        double r19397 = cos(r19396);
        double r19398 = r19395 * r19397;
        double r19399 = phi1;
        double r19400 = cos(r19399);
        double r19401 = sin(r19396);
        double r19402 = r19400 * r19401;
        double r19403 = sin(r19399);
        double r19404 = r19403 * r19397;
        double r19405 = r19391 * r19389;
        double r19406 = r19387 * (r19387 * r19387);
        double r19407 = r19393 * (r19393 * r19393);
        double r19408 = r19406 * r19407;
        double r19409 = cbrt(r19408);
        double r19410 = r19405 - r19409;
        double r19411 = r19404 * r19410;
        double r19412 = r19402 - r19411;
        double r19413 = atan2(r19398, r19412);
        return r19413;
}

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 r19414, r19415, r19416, r19417, r19418, r19419, r19420, r19421, r19422, r19423, r19424, r19425, r19426, r19427, r19428, r19429, r19430;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r19414);
        mpfr_init(r19415);
        mpfr_init(r19416);
        mpfr_init(r19417);
        mpfr_init(r19418);
        mpfr_init(r19419);
        mpfr_init(r19420);
        mpfr_init(r19421);
        mpfr_init(r19422);
        mpfr_init(r19423);
        mpfr_init(r19424);
        mpfr_init(r19425);
        mpfr_init(r19426);
        mpfr_init(r19427);
        mpfr_init(r19428);
        mpfr_init(r19429);
        mpfr_init(r19430);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r19414, lambda1, MPFR_RNDN);
        mpfr_set_d(r19415, lambda2, MPFR_RNDN);
        mpfr_sub(r19416, r19414, r19415, MPFR_RNDN);
        mpfr_sin(r19417, r19416, MPFR_RNDN);
        mpfr_set_d(r19418, phi2, MPFR_RNDN);
        mpfr_cos(r19419, r19418, MPFR_RNDN);
        mpfr_mul(r19420, r19417, r19419, MPFR_RNDN);
        mpfr_set_d(r19421, phi1, MPFR_RNDN);
        mpfr_cos(r19422, r19421, MPFR_RNDN);
        mpfr_sin(r19423, r19418, MPFR_RNDN);
        mpfr_mul(r19424, r19422, r19423, MPFR_RNDN);
        mpfr_sin(r19425, r19421, MPFR_RNDN);
        mpfr_mul(r19426, r19425, r19419, MPFR_RNDN);
        mpfr_cos(r19427, r19416, MPFR_RNDN);
        mpfr_mul(r19428, r19426, r19427, MPFR_RNDN);
        mpfr_sub(r19429, r19424, r19428, MPFR_RNDN);
        mpfr_atan2(r19430, r19420, r19429, MPFR_RNDN);
        return mpfr_get_d(r19430, MPFR_RNDN);
}

static mpfr_t r19431, r19432, r19433, r19434, r19435, r19436, r19437, r19438, r19439, r19440, r19441, r19442, r19443, r19444, r19445, r19446, r19447, r19448, r19449, r19450, r19451, r19452, r19453, r19454, r19455, r19456, r19457, r19458;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r19431);
        mpfr_init(r19432);
        mpfr_init(r19433);
        mpfr_init(r19434);
        mpfr_init(r19435);
        mpfr_init(r19436);
        mpfr_init(r19437);
        mpfr_init(r19438);
        mpfr_init(r19439);
        mpfr_init(r19440);
        mpfr_init(r19441);
        mpfr_init(r19442);
        mpfr_init(r19443);
        mpfr_init(r19444);
        mpfr_init(r19445);
        mpfr_init(r19446);
        mpfr_init(r19447);
        mpfr_init(r19448);
        mpfr_init(r19449);
        mpfr_init(r19450);
        mpfr_init(r19451);
        mpfr_init(r19452);
        mpfr_init(r19453);
        mpfr_init(r19454);
        mpfr_init(r19455);
        mpfr_init(r19456);
        mpfr_init(r19457);
        mpfr_init(r19458);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r19431, lambda1, MPFR_RNDN);
        mpfr_sin(r19432, r19431, MPFR_RNDN);
        mpfr_set_d(r19433, lambda2, MPFR_RNDN);
        mpfr_cos(r19434, r19433, MPFR_RNDN);
        mpfr_mul(r19435, r19432, r19434, MPFR_RNDN);
        mpfr_cos(r19436, r19431, MPFR_RNDN);
        mpfr_neg(r19437, r19433, MPFR_RNDN);
        mpfr_sin(r19438, r19437, MPFR_RNDN);
        mpfr_mul(r19439, r19436, r19438, MPFR_RNDN);
        mpfr_add(r19440, r19435, r19439, MPFR_RNDN);
        mpfr_set_d(r19441, phi2, MPFR_RNDN);
        mpfr_cos(r19442, r19441, MPFR_RNDN);
        mpfr_mul(r19443, r19440, r19442, MPFR_RNDN);
        mpfr_set_d(r19444, phi1, MPFR_RNDN);
        mpfr_cos(r19445, r19444, MPFR_RNDN);
        mpfr_sin(r19446, r19441, MPFR_RNDN);
        mpfr_mul(r19447, r19445, r19446, MPFR_RNDN);
        mpfr_sin(r19448, r19444, MPFR_RNDN);
        mpfr_mul(r19449, r19448, r19442, MPFR_RNDN);
        mpfr_mul(r19450, r19436, r19434, MPFR_RNDN);
        mpfr_mul(r19451, r19432, r19432, MPFR_RNDN); mpfr_mul(r19451, r19451, r19432, MPFR_RNDN);
        mpfr_mul(r19452, r19438, r19438, MPFR_RNDN); mpfr_mul(r19452, r19452, r19438, MPFR_RNDN);
        mpfr_mul(r19453, r19451, r19452, MPFR_RNDN);
        mpfr_cbrt(r19454, r19453, MPFR_RNDN);
        mpfr_sub(r19455, r19450, r19454, MPFR_RNDN);
        mpfr_mul(r19456, r19449, r19455, MPFR_RNDN);
        mpfr_sub(r19457, r19447, r19456, MPFR_RNDN);
        mpfr_atan2(r19458, r19443, r19457, MPFR_RNDN);
        return mpfr_get_d(r19458, MPFR_RNDN);
}

static mpfr_t r19459, r19460, r19461, r19462, r19463, r19464, r19465, r19466, r19467, r19468, r19469, r19470, r19471, r19472, r19473, r19474, r19475, r19476, r19477, r19478, r19479, r19480, r19481, r19482, r19483, r19484, r19485, r19486;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r19459);
        mpfr_init(r19460);
        mpfr_init(r19461);
        mpfr_init(r19462);
        mpfr_init(r19463);
        mpfr_init(r19464);
        mpfr_init(r19465);
        mpfr_init(r19466);
        mpfr_init(r19467);
        mpfr_init(r19468);
        mpfr_init(r19469);
        mpfr_init(r19470);
        mpfr_init(r19471);
        mpfr_init(r19472);
        mpfr_init(r19473);
        mpfr_init(r19474);
        mpfr_init(r19475);
        mpfr_init(r19476);
        mpfr_init(r19477);
        mpfr_init(r19478);
        mpfr_init(r19479);
        mpfr_init(r19480);
        mpfr_init(r19481);
        mpfr_init(r19482);
        mpfr_init(r19483);
        mpfr_init(r19484);
        mpfr_init(r19485);
        mpfr_init(r19486);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r19459, lambda1, MPFR_RNDN);
        mpfr_sin(r19460, r19459, MPFR_RNDN);
        mpfr_set_d(r19461, lambda2, MPFR_RNDN);
        mpfr_cos(r19462, r19461, MPFR_RNDN);
        mpfr_mul(r19463, r19460, r19462, MPFR_RNDN);
        mpfr_cos(r19464, r19459, MPFR_RNDN);
        mpfr_neg(r19465, r19461, MPFR_RNDN);
        mpfr_sin(r19466, r19465, MPFR_RNDN);
        mpfr_mul(r19467, r19464, r19466, MPFR_RNDN);
        mpfr_add(r19468, r19463, r19467, MPFR_RNDN);
        mpfr_set_d(r19469, phi2, MPFR_RNDN);
        mpfr_cos(r19470, r19469, MPFR_RNDN);
        mpfr_mul(r19471, r19468, r19470, MPFR_RNDN);
        mpfr_set_d(r19472, phi1, MPFR_RNDN);
        mpfr_cos(r19473, r19472, MPFR_RNDN);
        mpfr_sin(r19474, r19469, MPFR_RNDN);
        mpfr_mul(r19475, r19473, r19474, MPFR_RNDN);
        mpfr_sin(r19476, r19472, MPFR_RNDN);
        mpfr_mul(r19477, r19476, r19470, MPFR_RNDN);
        mpfr_mul(r19478, r19464, r19462, MPFR_RNDN);
        mpfr_mul(r19479, r19460, r19460, MPFR_RNDN); mpfr_mul(r19479, r19479, r19460, MPFR_RNDN);
        mpfr_mul(r19480, r19466, r19466, MPFR_RNDN); mpfr_mul(r19480, r19480, r19466, MPFR_RNDN);
        mpfr_mul(r19481, r19479, r19480, MPFR_RNDN);
        mpfr_cbrt(r19482, r19481, MPFR_RNDN);
        mpfr_sub(r19483, r19478, r19482, MPFR_RNDN);
        mpfr_mul(r19484, r19477, r19483, MPFR_RNDN);
        mpfr_sub(r19485, r19475, r19484, MPFR_RNDN);
        mpfr_atan2(r19486, r19471, r19485, MPFR_RNDN);
        return mpfr_get_d(r19486, MPFR_RNDN);
}

