#include <tgmath.h>
#include <gmp.h>
#include <mpfr.h>
#include <stdio.h>
#include <stdbool.h>

char *name = "Destination given bearing on a great circle";

double f_if(float lambda1, float phi1, float __attribute__((unused)) phi2, float delta, float theta) {
        float r19170 = lambda1;
        float r19171 = theta;
        float r19172 = sin(r19171);
        float r19173 = delta;
        float r19174 = sin(r19173);
        float r19175 = r19172 * r19174;
        float r19176 = phi1;
        float r19177 = cos(r19176);
        float r19178 = r19175 * r19177;
        float r19179 = cos(r19173);
        float r19180 = sin(r19176);
        float r19181 = r19180 * r19179;
        float r19182 = r19177 * r19174;
        float r19183 = cos(r19171);
        float r19184 = r19182 * r19183;
        float r19185 = r19181 + r19184;
        float r19186 = asin(r19185);
        float r19187 = sin(r19186);
        float r19188 = r19180 * r19187;
        float r19189 = r19179 - r19188;
        float r19190 = atan2(r19178, r19189);
        float r19191 = r19170 + r19190;
        return r19191;
}

double f_id(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r19192 = lambda1;
        double r19193 = theta;
        double r19194 = sin(r19193);
        double r19195 = delta;
        double r19196 = sin(r19195);
        double r19197 = r19194 * r19196;
        double r19198 = phi1;
        double r19199 = cos(r19198);
        double r19200 = r19197 * r19199;
        double r19201 = cos(r19195);
        double r19202 = sin(r19198);
        double r19203 = r19202 * r19201;
        double r19204 = r19199 * r19196;
        double r19205 = cos(r19193);
        double r19206 = r19204 * r19205;
        double r19207 = r19203 + r19206;
        double r19208 = asin(r19207);
        double r19209 = sin(r19208);
        double r19210 = r19202 * r19209;
        double r19211 = r19201 - r19210;
        double r19212 = atan2(r19200, r19211);
        double r19213 = r19192 + r19212;
        return r19213;
}


double f_of(float lambda1, float phi1, float __attribute__((unused)) phi2, float delta, float theta) {
        float r19214 = lambda1;
        float r19215 = theta;
        float r19216 = sin(r19215);
        float r19217 = delta;
        float r19218 = sin(r19217);
        float r19219 = r19216 * r19218;
        float r19220 = phi1;
        float r19221 = cos(r19220);
        float r19222 = r19219 * r19221;
        float r19223 = cos(r19217);
        float r19224 = sin(r19220);
        float r19225 = r19224 * r19223;
        float r19226 = r19221 * r19218;
        float r19227 = cos(r19215);
        float r19228 = r19226 * r19227;
        float r19229 = r19225 + r19228;
        float r19230 = asin(r19229);
        float r19231 = sin(r19230);
        float r19232 = r19224 * r19231;
        float r19233 = r19223 - r19232;
        float r19234 = atan2(r19222, r19233);
        float r19235 = r19214 + r19234;
        return r19235;
}

double f_od(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r19236 = lambda1;
        double r19237 = theta;
        double r19238 = sin(r19237);
        double r19239 = delta;
        double r19240 = sin(r19239);
        double r19241 = r19238 * r19240;
        double r19242 = phi1;
        double r19243 = cos(r19242);
        double r19244 = r19241 * r19243;
        double r19245 = cos(r19239);
        double r19246 = sin(r19242);
        double r19247 = r19246 * r19245;
        double r19248 = r19243 * r19240;
        double r19249 = cos(r19237);
        double r19250 = r19248 * r19249;
        double r19251 = r19247 + r19250;
        double r19252 = asin(r19251);
        double r19253 = sin(r19252);
        double r19254 = r19246 * r19253;
        double r19255 = r19245 - r19254;
        double r19256 = atan2(r19244, r19255);
        double r19257 = r19236 + r19256;
        return r19257;
}

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 r19258, r19259, r19260, r19261, r19262, r19263, r19264, r19265, r19266, r19267, r19268, r19269, r19270, r19271, r19272, r19273, r19274, r19275, r19276, r19277, r19278, r19279;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r19258);
        mpfr_init(r19259);
        mpfr_init(r19260);
        mpfr_init(r19261);
        mpfr_init(r19262);
        mpfr_init(r19263);
        mpfr_init(r19264);
        mpfr_init(r19265);
        mpfr_init(r19266);
        mpfr_init(r19267);
        mpfr_init(r19268);
        mpfr_init(r19269);
        mpfr_init(r19270);
        mpfr_init(r19271);
        mpfr_init(r19272);
        mpfr_init(r19273);
        mpfr_init(r19274);
        mpfr_init(r19275);
        mpfr_init(r19276);
        mpfr_init(r19277);
        mpfr_init(r19278);
        mpfr_init(r19279);
}

double f_im(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r19258, lambda1, MPFR_RNDN);
        mpfr_set_d(r19259, theta, MPFR_RNDN);
        mpfr_sin(r19260, r19259, MPFR_RNDN);
        mpfr_set_d(r19261, delta, MPFR_RNDN);
        mpfr_sin(r19262, r19261, MPFR_RNDN);
        mpfr_mul(r19263, r19260, r19262, MPFR_RNDN);
        mpfr_set_d(r19264, phi1, MPFR_RNDN);
        mpfr_cos(r19265, r19264, MPFR_RNDN);
        mpfr_mul(r19266, r19263, r19265, MPFR_RNDN);
        mpfr_cos(r19267, r19261, MPFR_RNDN);
        mpfr_sin(r19268, r19264, MPFR_RNDN);
        mpfr_mul(r19269, r19268, r19267, MPFR_RNDN);
        mpfr_mul(r19270, r19265, r19262, MPFR_RNDN);
        mpfr_cos(r19271, r19259, MPFR_RNDN);
        mpfr_mul(r19272, r19270, r19271, MPFR_RNDN);
        mpfr_add(r19273, r19269, r19272, MPFR_RNDN);
        mpfr_asin(r19274, r19273, MPFR_RNDN);
        mpfr_sin(r19275, r19274, MPFR_RNDN);
        mpfr_mul(r19276, r19268, r19275, MPFR_RNDN);
        mpfr_sub(r19277, r19267, r19276, MPFR_RNDN);
        mpfr_atan2(r19278, r19266, r19277, MPFR_RNDN);
        mpfr_add(r19279, r19258, r19278, MPFR_RNDN);
        return mpfr_get_d(r19279, MPFR_RNDN);
}

static mpfr_t r19280, r19281, r19282, r19283, r19284, r19285, r19286, r19287, r19288, r19289, r19290, r19291, r19292, r19293, r19294, r19295, r19296, r19297, r19298, r19299, r19300, r19301;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r19280);
        mpfr_init(r19281);
        mpfr_init(r19282);
        mpfr_init(r19283);
        mpfr_init(r19284);
        mpfr_init(r19285);
        mpfr_init(r19286);
        mpfr_init(r19287);
        mpfr_init(r19288);
        mpfr_init(r19289);
        mpfr_init(r19290);
        mpfr_init(r19291);
        mpfr_init(r19292);
        mpfr_init(r19293);
        mpfr_init(r19294);
        mpfr_init(r19295);
        mpfr_init(r19296);
        mpfr_init(r19297);
        mpfr_init(r19298);
        mpfr_init(r19299);
        mpfr_init(r19300);
        mpfr_init(r19301);
}

double f_fm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r19280, lambda1, MPFR_RNDN);
        mpfr_set_d(r19281, theta, MPFR_RNDN);
        mpfr_sin(r19282, r19281, MPFR_RNDN);
        mpfr_set_d(r19283, delta, MPFR_RNDN);
        mpfr_sin(r19284, r19283, MPFR_RNDN);
        mpfr_mul(r19285, r19282, r19284, MPFR_RNDN);
        mpfr_set_d(r19286, phi1, MPFR_RNDN);
        mpfr_cos(r19287, r19286, MPFR_RNDN);
        mpfr_mul(r19288, r19285, r19287, MPFR_RNDN);
        mpfr_cos(r19289, r19283, MPFR_RNDN);
        mpfr_sin(r19290, r19286, MPFR_RNDN);
        mpfr_mul(r19291, r19290, r19289, MPFR_RNDN);
        mpfr_mul(r19292, r19287, r19284, MPFR_RNDN);
        mpfr_cos(r19293, r19281, MPFR_RNDN);
        mpfr_mul(r19294, r19292, r19293, MPFR_RNDN);
        mpfr_add(r19295, r19291, r19294, MPFR_RNDN);
        mpfr_asin(r19296, r19295, MPFR_RNDN);
        mpfr_sin(r19297, r19296, MPFR_RNDN);
        mpfr_mul(r19298, r19290, r19297, MPFR_RNDN);
        mpfr_sub(r19299, r19289, r19298, MPFR_RNDN);
        mpfr_atan2(r19300, r19288, r19299, MPFR_RNDN);
        mpfr_add(r19301, r19280, r19300, MPFR_RNDN);
        return mpfr_get_d(r19301, MPFR_RNDN);
}

static mpfr_t r19302, r19303, r19304, r19305, r19306, r19307, r19308, r19309, r19310, r19311, r19312, r19313, r19314, r19315, r19316, r19317, r19318, r19319, r19320, r19321, r19322, r19323;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r19302);
        mpfr_init(r19303);
        mpfr_init(r19304);
        mpfr_init(r19305);
        mpfr_init(r19306);
        mpfr_init(r19307);
        mpfr_init(r19308);
        mpfr_init(r19309);
        mpfr_init(r19310);
        mpfr_init(r19311);
        mpfr_init(r19312);
        mpfr_init(r19313);
        mpfr_init(r19314);
        mpfr_init(r19315);
        mpfr_init(r19316);
        mpfr_init(r19317);
        mpfr_init(r19318);
        mpfr_init(r19319);
        mpfr_init(r19320);
        mpfr_init(r19321);
        mpfr_init(r19322);
        mpfr_init(r19323);
}

double f_dm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r19302, lambda1, MPFR_RNDN);
        mpfr_set_d(r19303, theta, MPFR_RNDN);
        mpfr_sin(r19304, r19303, MPFR_RNDN);
        mpfr_set_d(r19305, delta, MPFR_RNDN);
        mpfr_sin(r19306, r19305, MPFR_RNDN);
        mpfr_mul(r19307, r19304, r19306, MPFR_RNDN);
        mpfr_set_d(r19308, phi1, MPFR_RNDN);
        mpfr_cos(r19309, r19308, MPFR_RNDN);
        mpfr_mul(r19310, r19307, r19309, MPFR_RNDN);
        mpfr_cos(r19311, r19305, MPFR_RNDN);
        mpfr_sin(r19312, r19308, MPFR_RNDN);
        mpfr_mul(r19313, r19312, r19311, MPFR_RNDN);
        mpfr_mul(r19314, r19309, r19306, MPFR_RNDN);
        mpfr_cos(r19315, r19303, MPFR_RNDN);
        mpfr_mul(r19316, r19314, r19315, MPFR_RNDN);
        mpfr_add(r19317, r19313, r19316, MPFR_RNDN);
        mpfr_asin(r19318, r19317, MPFR_RNDN);
        mpfr_sin(r19319, r19318, MPFR_RNDN);
        mpfr_mul(r19320, r19312, r19319, MPFR_RNDN);
        mpfr_sub(r19321, r19311, r19320, MPFR_RNDN);
        mpfr_atan2(r19322, r19310, r19321, MPFR_RNDN);
        mpfr_add(r19323, r19302, r19322, MPFR_RNDN);
        return mpfr_get_d(r19323, MPFR_RNDN);
}

