#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 r33224 = R;
        float r33225 = 2;
        float r33226 = phi1;
        float r33227 = phi2;
        float r33228 = r33226 - r33227;
        float r33229 = r33228 / r33225;
        float r33230 = sin(r33229);
        float r33231 = pow(r33230, r33225);
        float r33232 = cos(r33226);
        float r33233 = cos(r33227);
        float r33234 = r33232 * r33233;
        float r33235 = lambda1;
        float r33236 = lambda2;
        float r33237 = r33235 - r33236;
        float r33238 = r33237 / r33225;
        float r33239 = sin(r33238);
        float r33240 = r33234 * r33239;
        float r33241 = r33240 * r33239;
        float r33242 = r33231 + r33241;
        float r33243 = sqrt(r33242);
        float r33244 = 1;
        float r33245 = r33244 - r33242;
        float r33246 = sqrt(r33245);
        float r33247 = atan2(r33243, r33246);
        float r33248 = r33225 * r33247;
        float r33249 = r33224 * r33248;
        return r33249;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33250 = R;
        double r33251 = 2;
        double r33252 = phi1;
        double r33253 = phi2;
        double r33254 = r33252 - r33253;
        double r33255 = r33254 / r33251;
        double r33256 = sin(r33255);
        double r33257 = pow(r33256, r33251);
        double r33258 = cos(r33252);
        double r33259 = cos(r33253);
        double r33260 = r33258 * r33259;
        double r33261 = lambda1;
        double r33262 = lambda2;
        double r33263 = r33261 - r33262;
        double r33264 = r33263 / r33251;
        double r33265 = sin(r33264);
        double r33266 = r33260 * r33265;
        double r33267 = r33266 * r33265;
        double r33268 = r33257 + r33267;
        double r33269 = sqrt(r33268);
        double r33270 = 1;
        double r33271 = r33270 - r33268;
        double r33272 = sqrt(r33271);
        double r33273 = atan2(r33269, r33272);
        double r33274 = r33251 * r33273;
        double r33275 = r33250 * r33274;
        return r33275;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r33276 = R;
        float r33277 = 2;
        float r33278 = phi1;
        float r33279 = r33278 / r33277;
        float r33280 = sin(r33279);
        float r33281 = phi2;
        float r33282 = r33281 / r33277;
        float r33283 = cos(r33282);
        float r33284 = r33280 * r33283;
        float r33285 = cos(r33279);
        float r33286 = sin(r33282);
        float r33287 = r33285 * r33286;
        float r33288 = r33284 - r33287;
        float r33289 = pow(r33288, r33277);
        float r33290 = cos(r33278);
        float r33291 = cos(r33281);
        float r33292 = r33290 * r33291;
        float r33293 = lambda1;
        float r33294 = lambda2;
        float r33295 = r33293 - r33294;
        float r33296 = r33295 / r33277;
        float r33297 = sin(r33296);
        float r33298 = r33292 * r33297;
        float r33299 = r33298 * r33297;
        float r33300 = r33289 + r33299;
        float r33301 = sqrt(r33300);
        float r33302 = 1;
        float r33303 = cbrt(r33297);
        float r33304 = r33303 * r33303;
        float r33305 = r33304 * r33303;
        float r33306 = r33298 * r33305;
        float r33307 = r33289 + r33306;
        float r33308 = r33302 - r33307;
        float r33309 = sqrt(r33308);
        float r33310 = atan2(r33301, r33309);
        float r33311 = r33277 * r33310;
        float r33312 = r33276 * r33311;
        return r33312;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33313 = R;
        double r33314 = 2;
        double r33315 = phi1;
        double r33316 = r33315 / r33314;
        double r33317 = sin(r33316);
        double r33318 = phi2;
        double r33319 = r33318 / r33314;
        double r33320 = cos(r33319);
        double r33321 = r33317 * r33320;
        double r33322 = cos(r33316);
        double r33323 = sin(r33319);
        double r33324 = r33322 * r33323;
        double r33325 = r33321 - r33324;
        double r33326 = pow(r33325, r33314);
        double r33327 = cos(r33315);
        double r33328 = cos(r33318);
        double r33329 = r33327 * r33328;
        double r33330 = lambda1;
        double r33331 = lambda2;
        double r33332 = r33330 - r33331;
        double r33333 = r33332 / r33314;
        double r33334 = sin(r33333);
        double r33335 = r33329 * r33334;
        double r33336 = r33335 * r33334;
        double r33337 = r33326 + r33336;
        double r33338 = sqrt(r33337);
        double r33339 = 1;
        double r33340 = cbrt(r33334);
        double r33341 = r33340 * r33340;
        double r33342 = r33341 * r33340;
        double r33343 = r33335 * r33342;
        double r33344 = r33326 + r33343;
        double r33345 = r33339 - r33344;
        double r33346 = sqrt(r33345);
        double r33347 = atan2(r33338, r33346);
        double r33348 = r33314 * r33347;
        double r33349 = r33313 * r33348;
        return r33349;
}

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 r33350, r33351, r33352, r33353, r33354, r33355, r33356, r33357, r33358, r33359, r33360, r33361, r33362, r33363, r33364, r33365, r33366, r33367, r33368, r33369, r33370, r33371, r33372, r33373, r33374, r33375;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33350);
        mpfr_init_set_str(r33351, "2", 10, MPFR_RNDN);
        mpfr_init(r33352);
        mpfr_init(r33353);
        mpfr_init(r33354);
        mpfr_init(r33355);
        mpfr_init(r33356);
        mpfr_init(r33357);
        mpfr_init(r33358);
        mpfr_init(r33359);
        mpfr_init(r33360);
        mpfr_init(r33361);
        mpfr_init(r33362);
        mpfr_init(r33363);
        mpfr_init(r33364);
        mpfr_init(r33365);
        mpfr_init(r33366);
        mpfr_init(r33367);
        mpfr_init(r33368);
        mpfr_init(r33369);
        mpfr_init_set_str(r33370, "1", 10, MPFR_RNDN);
        mpfr_init(r33371);
        mpfr_init(r33372);
        mpfr_init(r33373);
        mpfr_init(r33374);
        mpfr_init(r33375);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33350, R, MPFR_RNDN);
        ;
        mpfr_set_d(r33352, phi1, MPFR_RNDN);
        mpfr_set_d(r33353, phi2, MPFR_RNDN);
        mpfr_sub(r33354, r33352, r33353, MPFR_RNDN);
        mpfr_div(r33355, r33354, r33351, MPFR_RNDN);
        mpfr_sin(r33356, r33355, MPFR_RNDN);
        mpfr_pow(r33357, r33356, r33351, MPFR_RNDN);
        mpfr_cos(r33358, r33352, MPFR_RNDN);
        mpfr_cos(r33359, r33353, MPFR_RNDN);
        mpfr_mul(r33360, r33358, r33359, MPFR_RNDN);
        mpfr_set_d(r33361, lambda1, MPFR_RNDN);
        mpfr_set_d(r33362, lambda2, MPFR_RNDN);
        mpfr_sub(r33363, r33361, r33362, MPFR_RNDN);
        mpfr_div(r33364, r33363, r33351, MPFR_RNDN);
        mpfr_sin(r33365, r33364, MPFR_RNDN);
        mpfr_mul(r33366, r33360, r33365, MPFR_RNDN);
        mpfr_mul(r33367, r33366, r33365, MPFR_RNDN);
        mpfr_add(r33368, r33357, r33367, MPFR_RNDN);
        mpfr_sqrt(r33369, r33368, MPFR_RNDN);
        ;
        mpfr_sub(r33371, r33370, r33368, MPFR_RNDN);
        mpfr_sqrt(r33372, r33371, MPFR_RNDN);
        mpfr_atan2(r33373, r33369, r33372, MPFR_RNDN);
        mpfr_mul(r33374, r33351, r33373, MPFR_RNDN);
        mpfr_mul(r33375, r33350, r33374, MPFR_RNDN);
        return mpfr_get_d(r33375, MPFR_RNDN);
}

static mpfr_t r33376, r33377, r33378, r33379, r33380, r33381, r33382, r33383, r33384, r33385, r33386, r33387, r33388, r33389, r33390, r33391, r33392, r33393, r33394, r33395, r33396, r33397, r33398, r33399, r33400, r33401, r33402, r33403, r33404, r33405, r33406, r33407, r33408, r33409, r33410, r33411, r33412;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33376);
        mpfr_init_set_str(r33377, "2", 10, MPFR_RNDN);
        mpfr_init(r33378);
        mpfr_init(r33379);
        mpfr_init(r33380);
        mpfr_init(r33381);
        mpfr_init(r33382);
        mpfr_init(r33383);
        mpfr_init(r33384);
        mpfr_init(r33385);
        mpfr_init(r33386);
        mpfr_init(r33387);
        mpfr_init(r33388);
        mpfr_init(r33389);
        mpfr_init(r33390);
        mpfr_init(r33391);
        mpfr_init(r33392);
        mpfr_init(r33393);
        mpfr_init(r33394);
        mpfr_init(r33395);
        mpfr_init(r33396);
        mpfr_init(r33397);
        mpfr_init(r33398);
        mpfr_init(r33399);
        mpfr_init(r33400);
        mpfr_init(r33401);
        mpfr_init_set_str(r33402, "1", 10, MPFR_RNDN);
        mpfr_init(r33403);
        mpfr_init(r33404);
        mpfr_init(r33405);
        mpfr_init(r33406);
        mpfr_init(r33407);
        mpfr_init(r33408);
        mpfr_init(r33409);
        mpfr_init(r33410);
        mpfr_init(r33411);
        mpfr_init(r33412);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33376, R, MPFR_RNDN);
        ;
        mpfr_set_d(r33378, phi1, MPFR_RNDN);
        mpfr_div(r33379, r33378, r33377, MPFR_RNDN);
        mpfr_sin(r33380, r33379, MPFR_RNDN);
        mpfr_set_d(r33381, phi2, MPFR_RNDN);
        mpfr_div(r33382, r33381, r33377, MPFR_RNDN);
        mpfr_cos(r33383, r33382, MPFR_RNDN);
        mpfr_mul(r33384, r33380, r33383, MPFR_RNDN);
        mpfr_cos(r33385, r33379, MPFR_RNDN);
        mpfr_sin(r33386, r33382, MPFR_RNDN);
        mpfr_mul(r33387, r33385, r33386, MPFR_RNDN);
        mpfr_sub(r33388, r33384, r33387, MPFR_RNDN);
        mpfr_pow(r33389, r33388, r33377, MPFR_RNDN);
        mpfr_cos(r33390, r33378, MPFR_RNDN);
        mpfr_cos(r33391, r33381, MPFR_RNDN);
        mpfr_mul(r33392, r33390, r33391, MPFR_RNDN);
        mpfr_set_d(r33393, lambda1, MPFR_RNDN);
        mpfr_set_d(r33394, lambda2, MPFR_RNDN);
        mpfr_sub(r33395, r33393, r33394, MPFR_RNDN);
        mpfr_div(r33396, r33395, r33377, MPFR_RNDN);
        mpfr_sin(r33397, r33396, MPFR_RNDN);
        mpfr_mul(r33398, r33392, r33397, MPFR_RNDN);
        mpfr_mul(r33399, r33398, r33397, MPFR_RNDN);
        mpfr_add(r33400, r33389, r33399, MPFR_RNDN);
        mpfr_sqrt(r33401, r33400, MPFR_RNDN);
        ;
        mpfr_cbrt(r33403, r33397, MPFR_RNDN);
        mpfr_mul(r33404, r33403, r33403, MPFR_RNDN);
        mpfr_mul(r33405, r33404, r33403, MPFR_RNDN);
        mpfr_mul(r33406, r33398, r33405, MPFR_RNDN);
        mpfr_add(r33407, r33389, r33406, MPFR_RNDN);
        mpfr_sub(r33408, r33402, r33407, MPFR_RNDN);
        mpfr_sqrt(r33409, r33408, MPFR_RNDN);
        mpfr_atan2(r33410, r33401, r33409, MPFR_RNDN);
        mpfr_mul(r33411, r33377, r33410, MPFR_RNDN);
        mpfr_mul(r33412, r33376, r33411, MPFR_RNDN);
        return mpfr_get_d(r33412, MPFR_RNDN);
}

static mpfr_t r33413, r33414, r33415, r33416, r33417, r33418, r33419, r33420, r33421, r33422, r33423, r33424, r33425, r33426, r33427, r33428, r33429, r33430, r33431, r33432, r33433, r33434, r33435, r33436, r33437, r33438, r33439, r33440, r33441, r33442, r33443, r33444, r33445, r33446, r33447, r33448, r33449;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33413);
        mpfr_init_set_str(r33414, "2", 10, MPFR_RNDN);
        mpfr_init(r33415);
        mpfr_init(r33416);
        mpfr_init(r33417);
        mpfr_init(r33418);
        mpfr_init(r33419);
        mpfr_init(r33420);
        mpfr_init(r33421);
        mpfr_init(r33422);
        mpfr_init(r33423);
        mpfr_init(r33424);
        mpfr_init(r33425);
        mpfr_init(r33426);
        mpfr_init(r33427);
        mpfr_init(r33428);
        mpfr_init(r33429);
        mpfr_init(r33430);
        mpfr_init(r33431);
        mpfr_init(r33432);
        mpfr_init(r33433);
        mpfr_init(r33434);
        mpfr_init(r33435);
        mpfr_init(r33436);
        mpfr_init(r33437);
        mpfr_init(r33438);
        mpfr_init_set_str(r33439, "1", 10, MPFR_RNDN);
        mpfr_init(r33440);
        mpfr_init(r33441);
        mpfr_init(r33442);
        mpfr_init(r33443);
        mpfr_init(r33444);
        mpfr_init(r33445);
        mpfr_init(r33446);
        mpfr_init(r33447);
        mpfr_init(r33448);
        mpfr_init(r33449);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33413, R, MPFR_RNDN);
        ;
        mpfr_set_d(r33415, phi1, MPFR_RNDN);
        mpfr_div(r33416, r33415, r33414, MPFR_RNDN);
        mpfr_sin(r33417, r33416, MPFR_RNDN);
        mpfr_set_d(r33418, phi2, MPFR_RNDN);
        mpfr_div(r33419, r33418, r33414, MPFR_RNDN);
        mpfr_cos(r33420, r33419, MPFR_RNDN);
        mpfr_mul(r33421, r33417, r33420, MPFR_RNDN);
        mpfr_cos(r33422, r33416, MPFR_RNDN);
        mpfr_sin(r33423, r33419, MPFR_RNDN);
        mpfr_mul(r33424, r33422, r33423, MPFR_RNDN);
        mpfr_sub(r33425, r33421, r33424, MPFR_RNDN);
        mpfr_pow(r33426, r33425, r33414, MPFR_RNDN);
        mpfr_cos(r33427, r33415, MPFR_RNDN);
        mpfr_cos(r33428, r33418, MPFR_RNDN);
        mpfr_mul(r33429, r33427, r33428, MPFR_RNDN);
        mpfr_set_d(r33430, lambda1, MPFR_RNDN);
        mpfr_set_d(r33431, lambda2, MPFR_RNDN);
        mpfr_sub(r33432, r33430, r33431, MPFR_RNDN);
        mpfr_div(r33433, r33432, r33414, MPFR_RNDN);
        mpfr_sin(r33434, r33433, MPFR_RNDN);
        mpfr_mul(r33435, r33429, r33434, MPFR_RNDN);
        mpfr_mul(r33436, r33435, r33434, MPFR_RNDN);
        mpfr_add(r33437, r33426, r33436, MPFR_RNDN);
        mpfr_sqrt(r33438, r33437, MPFR_RNDN);
        ;
        mpfr_cbrt(r33440, r33434, MPFR_RNDN);
        mpfr_mul(r33441, r33440, r33440, MPFR_RNDN);
        mpfr_mul(r33442, r33441, r33440, MPFR_RNDN);
        mpfr_mul(r33443, r33435, r33442, MPFR_RNDN);
        mpfr_add(r33444, r33426, r33443, MPFR_RNDN);
        mpfr_sub(r33445, r33439, r33444, MPFR_RNDN);
        mpfr_sqrt(r33446, r33445, MPFR_RNDN);
        mpfr_atan2(r33447, r33438, r33446, MPFR_RNDN);
        mpfr_mul(r33448, r33414, r33447, MPFR_RNDN);
        mpfr_mul(r33449, r33413, r33448, MPFR_RNDN);
        return mpfr_get_d(r33449, MPFR_RNDN);
}

