#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 r33328 = R;
        float r33329 = 2;
        float r33330 = phi1;
        float r33331 = phi2;
        float r33332 = r33330 - r33331;
        float r33333 = r33332 / r33329;
        float r33334 = sin(r33333);
        float r33335 = pow(r33334, r33329);
        float r33336 = cos(r33330);
        float r33337 = cos(r33331);
        float r33338 = r33336 * r33337;
        float r33339 = lambda1;
        float r33340 = lambda2;
        float r33341 = r33339 - r33340;
        float r33342 = r33341 / r33329;
        float r33343 = sin(r33342);
        float r33344 = r33338 * r33343;
        float r33345 = r33344 * r33343;
        float r33346 = r33335 + r33345;
        float r33347 = sqrt(r33346);
        float r33348 = 1;
        float r33349 = r33348 - r33346;
        float r33350 = sqrt(r33349);
        float r33351 = atan2(r33347, r33350);
        float r33352 = r33329 * r33351;
        float r33353 = r33328 * r33352;
        return r33353;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33354 = R;
        double r33355 = 2;
        double r33356 = phi1;
        double r33357 = phi2;
        double r33358 = r33356 - r33357;
        double r33359 = r33358 / r33355;
        double r33360 = sin(r33359);
        double r33361 = pow(r33360, r33355);
        double r33362 = cos(r33356);
        double r33363 = cos(r33357);
        double r33364 = r33362 * r33363;
        double r33365 = lambda1;
        double r33366 = lambda2;
        double r33367 = r33365 - r33366;
        double r33368 = r33367 / r33355;
        double r33369 = sin(r33368);
        double r33370 = r33364 * r33369;
        double r33371 = r33370 * r33369;
        double r33372 = r33361 + r33371;
        double r33373 = sqrt(r33372);
        double r33374 = 1;
        double r33375 = r33374 - r33372;
        double r33376 = sqrt(r33375);
        double r33377 = atan2(r33373, r33376);
        double r33378 = r33355 * r33377;
        double r33379 = r33354 * r33378;
        return r33379;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r33380 = R;
        float r33381 = 2;
        float r33382 = phi1;
        float r33383 = r33382 / r33381;
        float r33384 = sin(r33383);
        float r33385 = phi2;
        float r33386 = r33385 / r33381;
        float r33387 = cos(r33386);
        float r33388 = r33384 * r33387;
        float r33389 = cos(r33383);
        float r33390 = sin(r33386);
        float r33391 = r33389 * r33390;
        float r33392 = r33388 - r33391;
        float r33393 = pow(r33392, r33381);
        float r33394 = cos(r33382);
        float r33395 = cos(r33385);
        float r33396 = r33394 * r33395;
        float r33397 = lambda1;
        float r33398 = lambda2;
        float r33399 = r33397 - r33398;
        float r33400 = r33399 / r33381;
        float r33401 = sin(r33400);
        float r33402 = r33396 * r33401;
        float r33403 = 3;
        float r33404 = pow(r33401, r33403);
        float r33405 = cbrt(r33404);
        float r33406 = r33402 * r33405;
        float r33407 = r33393 + r33406;
        float r33408 = sqrt(r33407);
        float r33409 = 1;
        float r33410 = r33402 * r33401;
        float r33411 = r33393 + r33410;
        float r33412 = r33409 - r33411;
        float r33413 = sqrt(r33412);
        float r33414 = atan2(r33408, r33413);
        float r33415 = r33381 * r33414;
        float r33416 = r33380 * r33415;
        return r33416;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33417 = R;
        double r33418 = 2;
        double r33419 = phi1;
        double r33420 = r33419 / r33418;
        double r33421 = sin(r33420);
        double r33422 = phi2;
        double r33423 = r33422 / r33418;
        double r33424 = cos(r33423);
        double r33425 = r33421 * r33424;
        double r33426 = cos(r33420);
        double r33427 = sin(r33423);
        double r33428 = r33426 * r33427;
        double r33429 = r33425 - r33428;
        double r33430 = pow(r33429, r33418);
        double r33431 = cos(r33419);
        double r33432 = cos(r33422);
        double r33433 = r33431 * r33432;
        double r33434 = lambda1;
        double r33435 = lambda2;
        double r33436 = r33434 - r33435;
        double r33437 = r33436 / r33418;
        double r33438 = sin(r33437);
        double r33439 = r33433 * r33438;
        double r33440 = 3;
        double r33441 = pow(r33438, r33440);
        double r33442 = cbrt(r33441);
        double r33443 = r33439 * r33442;
        double r33444 = r33430 + r33443;
        double r33445 = sqrt(r33444);
        double r33446 = 1;
        double r33447 = r33439 * r33438;
        double r33448 = r33430 + r33447;
        double r33449 = r33446 - r33448;
        double r33450 = sqrt(r33449);
        double r33451 = atan2(r33445, r33450);
        double r33452 = r33418 * r33451;
        double r33453 = r33417 * r33452;
        return r33453;
}

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 r33454, r33455, r33456, r33457, r33458, r33459, r33460, r33461, r33462, r33463, r33464, r33465, r33466, r33467, r33468, r33469, r33470, r33471, r33472, r33473, r33474, r33475, r33476, r33477, r33478, r33479;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33454);
        mpfr_init_set_str(r33455, "2", 10, MPFR_RNDN);
        mpfr_init(r33456);
        mpfr_init(r33457);
        mpfr_init(r33458);
        mpfr_init(r33459);
        mpfr_init(r33460);
        mpfr_init(r33461);
        mpfr_init(r33462);
        mpfr_init(r33463);
        mpfr_init(r33464);
        mpfr_init(r33465);
        mpfr_init(r33466);
        mpfr_init(r33467);
        mpfr_init(r33468);
        mpfr_init(r33469);
        mpfr_init(r33470);
        mpfr_init(r33471);
        mpfr_init(r33472);
        mpfr_init(r33473);
        mpfr_init_set_str(r33474, "1", 10, MPFR_RNDN);
        mpfr_init(r33475);
        mpfr_init(r33476);
        mpfr_init(r33477);
        mpfr_init(r33478);
        mpfr_init(r33479);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33454, R, MPFR_RNDN);
        ;
        mpfr_set_d(r33456, phi1, MPFR_RNDN);
        mpfr_set_d(r33457, phi2, MPFR_RNDN);
        mpfr_sub(r33458, r33456, r33457, MPFR_RNDN);
        mpfr_div(r33459, r33458, r33455, MPFR_RNDN);
        mpfr_sin(r33460, r33459, MPFR_RNDN);
        mpfr_pow(r33461, r33460, r33455, MPFR_RNDN);
        mpfr_cos(r33462, r33456, MPFR_RNDN);
        mpfr_cos(r33463, r33457, MPFR_RNDN);
        mpfr_mul(r33464, r33462, r33463, MPFR_RNDN);
        mpfr_set_d(r33465, lambda1, MPFR_RNDN);
        mpfr_set_d(r33466, lambda2, MPFR_RNDN);
        mpfr_sub(r33467, r33465, r33466, MPFR_RNDN);
        mpfr_div(r33468, r33467, r33455, MPFR_RNDN);
        mpfr_sin(r33469, r33468, MPFR_RNDN);
        mpfr_mul(r33470, r33464, r33469, MPFR_RNDN);
        mpfr_mul(r33471, r33470, r33469, MPFR_RNDN);
        mpfr_add(r33472, r33461, r33471, MPFR_RNDN);
        mpfr_sqrt(r33473, r33472, MPFR_RNDN);
        ;
        mpfr_sub(r33475, r33474, r33472, MPFR_RNDN);
        mpfr_sqrt(r33476, r33475, MPFR_RNDN);
        mpfr_atan2(r33477, r33473, r33476, MPFR_RNDN);
        mpfr_mul(r33478, r33455, r33477, MPFR_RNDN);
        mpfr_mul(r33479, r33454, r33478, MPFR_RNDN);
        return mpfr_get_d(r33479, MPFR_RNDN);
}

static mpfr_t r33480, r33481, r33482, r33483, r33484, r33485, r33486, r33487, r33488, r33489, r33490, r33491, r33492, r33493, r33494, r33495, r33496, r33497, r33498, r33499, r33500, r33501, r33502, r33503, r33504, r33505, r33506, r33507, r33508, r33509, r33510, r33511, r33512, r33513, r33514, r33515, r33516;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33480);
        mpfr_init_set_str(r33481, "2", 10, MPFR_RNDN);
        mpfr_init(r33482);
        mpfr_init(r33483);
        mpfr_init(r33484);
        mpfr_init(r33485);
        mpfr_init(r33486);
        mpfr_init(r33487);
        mpfr_init(r33488);
        mpfr_init(r33489);
        mpfr_init(r33490);
        mpfr_init(r33491);
        mpfr_init(r33492);
        mpfr_init(r33493);
        mpfr_init(r33494);
        mpfr_init(r33495);
        mpfr_init(r33496);
        mpfr_init(r33497);
        mpfr_init(r33498);
        mpfr_init(r33499);
        mpfr_init(r33500);
        mpfr_init(r33501);
        mpfr_init(r33502);
        mpfr_init_set_str(r33503, "3", 10, MPFR_RNDN);
        mpfr_init(r33504);
        mpfr_init(r33505);
        mpfr_init(r33506);
        mpfr_init(r33507);
        mpfr_init(r33508);
        mpfr_init_set_str(r33509, "1", 10, MPFR_RNDN);
        mpfr_init(r33510);
        mpfr_init(r33511);
        mpfr_init(r33512);
        mpfr_init(r33513);
        mpfr_init(r33514);
        mpfr_init(r33515);
        mpfr_init(r33516);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33480, R, MPFR_RNDN);
        ;
        mpfr_set_d(r33482, phi1, MPFR_RNDN);
        mpfr_div(r33483, r33482, r33481, MPFR_RNDN);
        mpfr_sin(r33484, r33483, MPFR_RNDN);
        mpfr_set_d(r33485, phi2, MPFR_RNDN);
        mpfr_div(r33486, r33485, r33481, MPFR_RNDN);
        mpfr_cos(r33487, r33486, MPFR_RNDN);
        mpfr_mul(r33488, r33484, r33487, MPFR_RNDN);
        mpfr_cos(r33489, r33483, MPFR_RNDN);
        mpfr_sin(r33490, r33486, MPFR_RNDN);
        mpfr_mul(r33491, r33489, r33490, MPFR_RNDN);
        mpfr_sub(r33492, r33488, r33491, MPFR_RNDN);
        mpfr_pow(r33493, r33492, r33481, MPFR_RNDN);
        mpfr_cos(r33494, r33482, MPFR_RNDN);
        mpfr_cos(r33495, r33485, MPFR_RNDN);
        mpfr_mul(r33496, r33494, r33495, MPFR_RNDN);
        mpfr_set_d(r33497, lambda1, MPFR_RNDN);
        mpfr_set_d(r33498, lambda2, MPFR_RNDN);
        mpfr_sub(r33499, r33497, r33498, MPFR_RNDN);
        mpfr_div(r33500, r33499, r33481, MPFR_RNDN);
        mpfr_sin(r33501, r33500, MPFR_RNDN);
        mpfr_mul(r33502, r33496, r33501, MPFR_RNDN);
        ;
        mpfr_pow(r33504, r33501, r33503, MPFR_RNDN);
        mpfr_cbrt(r33505, r33504, MPFR_RNDN);
        mpfr_mul(r33506, r33502, r33505, MPFR_RNDN);
        mpfr_add(r33507, r33493, r33506, MPFR_RNDN);
        mpfr_sqrt(r33508, r33507, MPFR_RNDN);
        ;
        mpfr_mul(r33510, r33502, r33501, MPFR_RNDN);
        mpfr_add(r33511, r33493, r33510, MPFR_RNDN);
        mpfr_sub(r33512, r33509, r33511, MPFR_RNDN);
        mpfr_sqrt(r33513, r33512, MPFR_RNDN);
        mpfr_atan2(r33514, r33508, r33513, MPFR_RNDN);
        mpfr_mul(r33515, r33481, r33514, MPFR_RNDN);
        mpfr_mul(r33516, r33480, r33515, MPFR_RNDN);
        return mpfr_get_d(r33516, MPFR_RNDN);
}

static mpfr_t r33517, r33518, r33519, r33520, r33521, r33522, r33523, r33524, r33525, r33526, r33527, r33528, r33529, r33530, r33531, r33532, r33533, r33534, r33535, r33536, r33537, r33538, r33539, r33540, r33541, r33542, r33543, r33544, r33545, r33546, r33547, r33548, r33549, r33550, r33551, r33552, r33553;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33517);
        mpfr_init_set_str(r33518, "2", 10, MPFR_RNDN);
        mpfr_init(r33519);
        mpfr_init(r33520);
        mpfr_init(r33521);
        mpfr_init(r33522);
        mpfr_init(r33523);
        mpfr_init(r33524);
        mpfr_init(r33525);
        mpfr_init(r33526);
        mpfr_init(r33527);
        mpfr_init(r33528);
        mpfr_init(r33529);
        mpfr_init(r33530);
        mpfr_init(r33531);
        mpfr_init(r33532);
        mpfr_init(r33533);
        mpfr_init(r33534);
        mpfr_init(r33535);
        mpfr_init(r33536);
        mpfr_init(r33537);
        mpfr_init(r33538);
        mpfr_init(r33539);
        mpfr_init_set_str(r33540, "3", 10, MPFR_RNDN);
        mpfr_init(r33541);
        mpfr_init(r33542);
        mpfr_init(r33543);
        mpfr_init(r33544);
        mpfr_init(r33545);
        mpfr_init_set_str(r33546, "1", 10, MPFR_RNDN);
        mpfr_init(r33547);
        mpfr_init(r33548);
        mpfr_init(r33549);
        mpfr_init(r33550);
        mpfr_init(r33551);
        mpfr_init(r33552);
        mpfr_init(r33553);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33517, R, MPFR_RNDN);
        ;
        mpfr_set_d(r33519, phi1, MPFR_RNDN);
        mpfr_div(r33520, r33519, r33518, MPFR_RNDN);
        mpfr_sin(r33521, r33520, MPFR_RNDN);
        mpfr_set_d(r33522, phi2, MPFR_RNDN);
        mpfr_div(r33523, r33522, r33518, MPFR_RNDN);
        mpfr_cos(r33524, r33523, MPFR_RNDN);
        mpfr_mul(r33525, r33521, r33524, MPFR_RNDN);
        mpfr_cos(r33526, r33520, MPFR_RNDN);
        mpfr_sin(r33527, r33523, MPFR_RNDN);
        mpfr_mul(r33528, r33526, r33527, MPFR_RNDN);
        mpfr_sub(r33529, r33525, r33528, MPFR_RNDN);
        mpfr_pow(r33530, r33529, r33518, MPFR_RNDN);
        mpfr_cos(r33531, r33519, MPFR_RNDN);
        mpfr_cos(r33532, r33522, MPFR_RNDN);
        mpfr_mul(r33533, r33531, r33532, MPFR_RNDN);
        mpfr_set_d(r33534, lambda1, MPFR_RNDN);
        mpfr_set_d(r33535, lambda2, MPFR_RNDN);
        mpfr_sub(r33536, r33534, r33535, MPFR_RNDN);
        mpfr_div(r33537, r33536, r33518, MPFR_RNDN);
        mpfr_sin(r33538, r33537, MPFR_RNDN);
        mpfr_mul(r33539, r33533, r33538, MPFR_RNDN);
        ;
        mpfr_pow(r33541, r33538, r33540, MPFR_RNDN);
        mpfr_cbrt(r33542, r33541, MPFR_RNDN);
        mpfr_mul(r33543, r33539, r33542, MPFR_RNDN);
        mpfr_add(r33544, r33530, r33543, MPFR_RNDN);
        mpfr_sqrt(r33545, r33544, MPFR_RNDN);
        ;
        mpfr_mul(r33547, r33539, r33538, MPFR_RNDN);
        mpfr_add(r33548, r33530, r33547, MPFR_RNDN);
        mpfr_sub(r33549, r33546, r33548, MPFR_RNDN);
        mpfr_sqrt(r33550, r33549, MPFR_RNDN);
        mpfr_atan2(r33551, r33545, r33550, MPFR_RNDN);
        mpfr_mul(r33552, r33518, r33551, MPFR_RNDN);
        mpfr_mul(r33553, r33517, r33552, MPFR_RNDN);
        return mpfr_get_d(r33553, MPFR_RNDN);
}

