#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 r25841 = lambda1;
        float r25842 = theta;
        float r25843 = sin(r25842);
        float r25844 = delta;
        float r25845 = sin(r25844);
        float r25846 = r25843 * r25845;
        float r25847 = phi1;
        float r25848 = cos(r25847);
        float r25849 = r25846 * r25848;
        float r25850 = cos(r25844);
        float r25851 = sin(r25847);
        float r25852 = r25851 * r25850;
        float r25853 = r25848 * r25845;
        float r25854 = cos(r25842);
        float r25855 = r25853 * r25854;
        float r25856 = r25852 + r25855;
        float r25857 = asin(r25856);
        float r25858 = sin(r25857);
        float r25859 = r25851 * r25858;
        float r25860 = r25850 - r25859;
        float r25861 = atan2(r25849, r25860);
        float r25862 = r25841 + r25861;
        return r25862;
}

double f_id(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r25863 = lambda1;
        double r25864 = theta;
        double r25865 = sin(r25864);
        double r25866 = delta;
        double r25867 = sin(r25866);
        double r25868 = r25865 * r25867;
        double r25869 = phi1;
        double r25870 = cos(r25869);
        double r25871 = r25868 * r25870;
        double r25872 = cos(r25866);
        double r25873 = sin(r25869);
        double r25874 = r25873 * r25872;
        double r25875 = r25870 * r25867;
        double r25876 = cos(r25864);
        double r25877 = r25875 * r25876;
        double r25878 = r25874 + r25877;
        double r25879 = asin(r25878);
        double r25880 = sin(r25879);
        double r25881 = r25873 * r25880;
        double r25882 = r25872 - r25881;
        double r25883 = atan2(r25871, r25882);
        double r25884 = r25863 + r25883;
        return r25884;
}


double f_of(float lambda1, float phi1, float __attribute__((unused)) phi2, float delta, float theta) {
        float r25885 = lambda1;
        float r25886 = theta;
        float r25887 = sin(r25886);
        float r25888 = delta;
        float r25889 = sin(r25888);
        float r25890 = r25887 * r25889;
        float r25891 = phi1;
        float r25892 = cos(r25891);
        float r25893 = r25890 * r25892;
        float r25894 = cos(r25888);
        float r25895 = cos(r25886);
        float r25896 = r25889 * r25895;
        float r25897 = sin(r25891);
        float r25898 = r25894 * r25897;
        float r25899 = fma(r25892, r25896, r25898);
        float r25900 = asin(r25899);
        float r25901 = sin(r25900);
        float r25902 = r25901 * r25897;
        float r25903 = expm1(r25902);
        float r25904 = log1p(r25903);
        float r25905 = r25894 - r25904;
        float r25906 = atan2(r25893, r25905);
        float r25907 = r25885 + r25906;
        return r25907;
}

double f_od(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r25908 = lambda1;
        double r25909 = theta;
        double r25910 = sin(r25909);
        double r25911 = delta;
        double r25912 = sin(r25911);
        double r25913 = r25910 * r25912;
        double r25914 = phi1;
        double r25915 = cos(r25914);
        double r25916 = r25913 * r25915;
        double r25917 = cos(r25911);
        double r25918 = cos(r25909);
        double r25919 = r25912 * r25918;
        double r25920 = sin(r25914);
        double r25921 = r25917 * r25920;
        double r25922 = fma(r25915, r25919, r25921);
        double r25923 = asin(r25922);
        double r25924 = sin(r25923);
        double r25925 = r25924 * r25920;
        double r25926 = expm1(r25925);
        double r25927 = log1p(r25926);
        double r25928 = r25917 - r25927;
        double r25929 = atan2(r25916, r25928);
        double r25930 = r25908 + r25929;
        return r25930;
}

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 r25931, r25932, r25933, r25934, r25935, r25936, r25937, r25938, r25939, r25940, r25941, r25942, r25943, r25944, r25945, r25946, r25947, r25948, r25949, r25950, r25951, r25952;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r25931);
        mpfr_init(r25932);
        mpfr_init(r25933);
        mpfr_init(r25934);
        mpfr_init(r25935);
        mpfr_init(r25936);
        mpfr_init(r25937);
        mpfr_init(r25938);
        mpfr_init(r25939);
        mpfr_init(r25940);
        mpfr_init(r25941);
        mpfr_init(r25942);
        mpfr_init(r25943);
        mpfr_init(r25944);
        mpfr_init(r25945);
        mpfr_init(r25946);
        mpfr_init(r25947);
        mpfr_init(r25948);
        mpfr_init(r25949);
        mpfr_init(r25950);
        mpfr_init(r25951);
        mpfr_init(r25952);
}

double f_im(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r25931, lambda1, MPFR_RNDN);
        mpfr_set_d(r25932, theta, MPFR_RNDN);
        mpfr_sin(r25933, r25932, MPFR_RNDN);
        mpfr_set_d(r25934, delta, MPFR_RNDN);
        mpfr_sin(r25935, r25934, MPFR_RNDN);
        mpfr_mul(r25936, r25933, r25935, MPFR_RNDN);
        mpfr_set_d(r25937, phi1, MPFR_RNDN);
        mpfr_cos(r25938, r25937, MPFR_RNDN);
        mpfr_mul(r25939, r25936, r25938, MPFR_RNDN);
        mpfr_cos(r25940, r25934, MPFR_RNDN);
        mpfr_sin(r25941, r25937, MPFR_RNDN);
        mpfr_mul(r25942, r25941, r25940, MPFR_RNDN);
        mpfr_mul(r25943, r25938, r25935, MPFR_RNDN);
        mpfr_cos(r25944, r25932, MPFR_RNDN);
        mpfr_mul(r25945, r25943, r25944, MPFR_RNDN);
        mpfr_add(r25946, r25942, r25945, MPFR_RNDN);
        mpfr_asin(r25947, r25946, MPFR_RNDN);
        mpfr_sin(r25948, r25947, MPFR_RNDN);
        mpfr_mul(r25949, r25941, r25948, MPFR_RNDN);
        mpfr_sub(r25950, r25940, r25949, MPFR_RNDN);
        mpfr_atan2(r25951, r25939, r25950, MPFR_RNDN);
        mpfr_add(r25952, r25931, r25951, MPFR_RNDN);
        return mpfr_get_d(r25952, MPFR_RNDN);
}

static mpfr_t r25953, r25954, r25955, r25956, r25957, r25958, r25959, r25960, r25961, r25962, r25963, r25964, r25965, r25966, r25967, r25968, r25969, r25970, r25971, r25972, r25973, r25974, r25975;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r25953);
        mpfr_init(r25954);
        mpfr_init(r25955);
        mpfr_init(r25956);
        mpfr_init(r25957);
        mpfr_init(r25958);
        mpfr_init(r25959);
        mpfr_init(r25960);
        mpfr_init(r25961);
        mpfr_init(r25962);
        mpfr_init(r25963);
        mpfr_init(r25964);
        mpfr_init(r25965);
        mpfr_init(r25966);
        mpfr_init(r25967);
        mpfr_init(r25968);
        mpfr_init(r25969);
        mpfr_init(r25970);
        mpfr_init(r25971);
        mpfr_init(r25972);
        mpfr_init(r25973);
        mpfr_init(r25974);
        mpfr_init(r25975);
}

double f_fm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r25953, lambda1, MPFR_RNDN);
        mpfr_set_d(r25954, theta, MPFR_RNDN);
        mpfr_sin(r25955, r25954, MPFR_RNDN);
        mpfr_set_d(r25956, delta, MPFR_RNDN);
        mpfr_sin(r25957, r25956, MPFR_RNDN);
        mpfr_mul(r25958, r25955, r25957, MPFR_RNDN);
        mpfr_set_d(r25959, phi1, MPFR_RNDN);
        mpfr_cos(r25960, r25959, MPFR_RNDN);
        mpfr_mul(r25961, r25958, r25960, MPFR_RNDN);
        mpfr_cos(r25962, r25956, MPFR_RNDN);
        mpfr_cos(r25963, r25954, MPFR_RNDN);
        mpfr_mul(r25964, r25957, r25963, MPFR_RNDN);
        mpfr_sin(r25965, r25959, MPFR_RNDN);
        mpfr_mul(r25966, r25962, r25965, MPFR_RNDN);
        mpfr_fma(r25967, r25960, r25964, r25966, MPFR_RNDN);
        mpfr_asin(r25968, r25967, MPFR_RNDN);
        mpfr_sin(r25969, r25968, MPFR_RNDN);
        mpfr_mul(r25970, r25969, r25965, MPFR_RNDN);
        mpfr_expm1(r25971, r25970, MPFR_RNDN);
        mpfr_log1p(r25972, r25971, MPFR_RNDN);
        mpfr_sub(r25973, r25962, r25972, MPFR_RNDN);
        mpfr_atan2(r25974, r25961, r25973, MPFR_RNDN);
        mpfr_add(r25975, r25953, r25974, MPFR_RNDN);
        return mpfr_get_d(r25975, MPFR_RNDN);
}

static mpfr_t r25976, r25977, r25978, r25979, r25980, r25981, r25982, r25983, r25984, r25985, r25986, r25987, r25988, r25989, r25990, r25991, r25992, r25993, r25994, r25995, r25996, r25997, r25998;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r25976);
        mpfr_init(r25977);
        mpfr_init(r25978);
        mpfr_init(r25979);
        mpfr_init(r25980);
        mpfr_init(r25981);
        mpfr_init(r25982);
        mpfr_init(r25983);
        mpfr_init(r25984);
        mpfr_init(r25985);
        mpfr_init(r25986);
        mpfr_init(r25987);
        mpfr_init(r25988);
        mpfr_init(r25989);
        mpfr_init(r25990);
        mpfr_init(r25991);
        mpfr_init(r25992);
        mpfr_init(r25993);
        mpfr_init(r25994);
        mpfr_init(r25995);
        mpfr_init(r25996);
        mpfr_init(r25997);
        mpfr_init(r25998);
}

double f_dm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r25976, lambda1, MPFR_RNDN);
        mpfr_set_d(r25977, theta, MPFR_RNDN);
        mpfr_sin(r25978, r25977, MPFR_RNDN);
        mpfr_set_d(r25979, delta, MPFR_RNDN);
        mpfr_sin(r25980, r25979, MPFR_RNDN);
        mpfr_mul(r25981, r25978, r25980, MPFR_RNDN);
        mpfr_set_d(r25982, phi1, MPFR_RNDN);
        mpfr_cos(r25983, r25982, MPFR_RNDN);
        mpfr_mul(r25984, r25981, r25983, MPFR_RNDN);
        mpfr_cos(r25985, r25979, MPFR_RNDN);
        mpfr_cos(r25986, r25977, MPFR_RNDN);
        mpfr_mul(r25987, r25980, r25986, MPFR_RNDN);
        mpfr_sin(r25988, r25982, MPFR_RNDN);
        mpfr_mul(r25989, r25985, r25988, MPFR_RNDN);
        mpfr_fma(r25990, r25983, r25987, r25989, MPFR_RNDN);
        mpfr_asin(r25991, r25990, MPFR_RNDN);
        mpfr_sin(r25992, r25991, MPFR_RNDN);
        mpfr_mul(r25993, r25992, r25988, MPFR_RNDN);
        mpfr_expm1(r25994, r25993, MPFR_RNDN);
        mpfr_log1p(r25995, r25994, MPFR_RNDN);
        mpfr_sub(r25996, r25985, r25995, MPFR_RNDN);
        mpfr_atan2(r25997, r25984, r25996, MPFR_RNDN);
        mpfr_add(r25998, r25976, r25997, MPFR_RNDN);
        return mpfr_get_d(r25998, MPFR_RNDN);
}

