#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 r26774 = lambda1;
        float r26775 = lambda2;
        float r26776 = r26774 - r26775;
        float r26777 = sin(r26776);
        float r26778 = phi2;
        float r26779 = cos(r26778);
        float r26780 = r26777 * r26779;
        float r26781 = phi1;
        float r26782 = cos(r26781);
        float r26783 = sin(r26778);
        float r26784 = r26782 * r26783;
        float r26785 = sin(r26781);
        float r26786 = r26785 * r26779;
        float r26787 = cos(r26776);
        float r26788 = r26786 * r26787;
        float r26789 = r26784 - r26788;
        float r26790 = atan2(r26780, r26789);
        return r26790;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r26791 = lambda1;
        double r26792 = lambda2;
        double r26793 = r26791 - r26792;
        double r26794 = sin(r26793);
        double r26795 = phi2;
        double r26796 = cos(r26795);
        double r26797 = r26794 * r26796;
        double r26798 = phi1;
        double r26799 = cos(r26798);
        double r26800 = sin(r26795);
        double r26801 = r26799 * r26800;
        double r26802 = sin(r26798);
        double r26803 = r26802 * r26796;
        double r26804 = cos(r26793);
        double r26805 = r26803 * r26804;
        double r26806 = r26801 - r26805;
        double r26807 = atan2(r26797, r26806);
        return r26807;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r26808 = lambda1;
        float r26809 = sin(r26808);
        float r26810 = lambda2;
        float r26811 = cos(r26810);
        float r26812 = cos(r26808);
        float r26813 = -r26810;
        float r26814 = sin(r26813);
        float r26815 = r26812 * r26814;
        float r26816 = fma(r26809, r26811, r26815);
        float r26817 = phi2;
        float r26818 = cos(r26817);
        float r26819 = r26816 * r26818;
        float r26820 = phi1;
        float r26821 = cos(r26820);
        float r26822 = sin(r26817);
        float r26823 = r26821 * r26822;
        float r26824 = r26811 * r26812;
        float r26825 = r26824 * r26824;
        float r26826 = sin(r26810);
        float r26827 = r26809 * r26826;
        float r26828 = r26827 * r26827;
        float r26829 = r26825 - r26828;
        float r26830 = sin(r26820);
        float r26831 = r26818 * r26830;
        float r26832 = r26829 * r26831;
        float r26833 = r26812 * r26811;
        float r26834 = r26809 * r26814;
        float r26835 = r26833 + r26834;
        float r26836 = r26832 / r26835;
        float r26837 = r26823 - r26836;
        float r26838 = atan2(r26819, r26837);
        return r26838;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r26839 = lambda1;
        double r26840 = sin(r26839);
        double r26841 = lambda2;
        double r26842 = cos(r26841);
        double r26843 = cos(r26839);
        double r26844 = -r26841;
        double r26845 = sin(r26844);
        double r26846 = r26843 * r26845;
        double r26847 = fma(r26840, r26842, r26846);
        double r26848 = phi2;
        double r26849 = cos(r26848);
        double r26850 = r26847 * r26849;
        double r26851 = phi1;
        double r26852 = cos(r26851);
        double r26853 = sin(r26848);
        double r26854 = r26852 * r26853;
        double r26855 = r26842 * r26843;
        double r26856 = r26855 * r26855;
        double r26857 = sin(r26841);
        double r26858 = r26840 * r26857;
        double r26859 = r26858 * r26858;
        double r26860 = r26856 - r26859;
        double r26861 = sin(r26851);
        double r26862 = r26849 * r26861;
        double r26863 = r26860 * r26862;
        double r26864 = r26843 * r26842;
        double r26865 = r26840 * r26845;
        double r26866 = r26864 + r26865;
        double r26867 = r26863 / r26866;
        double r26868 = r26854 - r26867;
        double r26869 = atan2(r26850, r26868);
        return r26869;
}

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 r26870, r26871, r26872, r26873, r26874, r26875, r26876, r26877, r26878, r26879, r26880, r26881, r26882, r26883, r26884, r26885, r26886;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26870);
        mpfr_init(r26871);
        mpfr_init(r26872);
        mpfr_init(r26873);
        mpfr_init(r26874);
        mpfr_init(r26875);
        mpfr_init(r26876);
        mpfr_init(r26877);
        mpfr_init(r26878);
        mpfr_init(r26879);
        mpfr_init(r26880);
        mpfr_init(r26881);
        mpfr_init(r26882);
        mpfr_init(r26883);
        mpfr_init(r26884);
        mpfr_init(r26885);
        mpfr_init(r26886);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26870, lambda1, MPFR_RNDN);
        mpfr_set_d(r26871, lambda2, MPFR_RNDN);
        mpfr_sub(r26872, r26870, r26871, MPFR_RNDN);
        mpfr_sin(r26873, r26872, MPFR_RNDN);
        mpfr_set_d(r26874, phi2, MPFR_RNDN);
        mpfr_cos(r26875, r26874, MPFR_RNDN);
        mpfr_mul(r26876, r26873, r26875, MPFR_RNDN);
        mpfr_set_d(r26877, phi1, MPFR_RNDN);
        mpfr_cos(r26878, r26877, MPFR_RNDN);
        mpfr_sin(r26879, r26874, MPFR_RNDN);
        mpfr_mul(r26880, r26878, r26879, MPFR_RNDN);
        mpfr_sin(r26881, r26877, MPFR_RNDN);
        mpfr_mul(r26882, r26881, r26875, MPFR_RNDN);
        mpfr_cos(r26883, r26872, MPFR_RNDN);
        mpfr_mul(r26884, r26882, r26883, MPFR_RNDN);
        mpfr_sub(r26885, r26880, r26884, MPFR_RNDN);
        mpfr_atan2(r26886, r26876, r26885, MPFR_RNDN);
        return mpfr_get_d(r26886, MPFR_RNDN);
}

static mpfr_t r26887, r26888, r26889, r26890, r26891, r26892, r26893, r26894, r26895, r26896, r26897, r26898, r26899, r26900, r26901, r26902, r26903, r26904, r26905, r26906, r26907, r26908, r26909, r26910, r26911, r26912, r26913, r26914, r26915, r26916, r26917;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26887);
        mpfr_init(r26888);
        mpfr_init(r26889);
        mpfr_init(r26890);
        mpfr_init(r26891);
        mpfr_init(r26892);
        mpfr_init(r26893);
        mpfr_init(r26894);
        mpfr_init(r26895);
        mpfr_init(r26896);
        mpfr_init(r26897);
        mpfr_init(r26898);
        mpfr_init(r26899);
        mpfr_init(r26900);
        mpfr_init(r26901);
        mpfr_init(r26902);
        mpfr_init(r26903);
        mpfr_init(r26904);
        mpfr_init(r26905);
        mpfr_init(r26906);
        mpfr_init(r26907);
        mpfr_init(r26908);
        mpfr_init(r26909);
        mpfr_init(r26910);
        mpfr_init(r26911);
        mpfr_init(r26912);
        mpfr_init(r26913);
        mpfr_init(r26914);
        mpfr_init(r26915);
        mpfr_init(r26916);
        mpfr_init(r26917);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26887, lambda1, MPFR_RNDN);
        mpfr_sin(r26888, r26887, MPFR_RNDN);
        mpfr_set_d(r26889, lambda2, MPFR_RNDN);
        mpfr_cos(r26890, r26889, MPFR_RNDN);
        mpfr_cos(r26891, r26887, MPFR_RNDN);
        mpfr_neg(r26892, r26889, MPFR_RNDN);
        mpfr_sin(r26893, r26892, MPFR_RNDN);
        mpfr_mul(r26894, r26891, r26893, MPFR_RNDN);
        mpfr_fma(r26895, r26888, r26890, r26894, MPFR_RNDN);
        mpfr_set_d(r26896, phi2, MPFR_RNDN);
        mpfr_cos(r26897, r26896, MPFR_RNDN);
        mpfr_mul(r26898, r26895, r26897, MPFR_RNDN);
        mpfr_set_d(r26899, phi1, MPFR_RNDN);
        mpfr_cos(r26900, r26899, MPFR_RNDN);
        mpfr_sin(r26901, r26896, MPFR_RNDN);
        mpfr_mul(r26902, r26900, r26901, MPFR_RNDN);
        mpfr_mul(r26903, r26890, r26891, MPFR_RNDN);
        mpfr_mul(r26904, r26903, r26903, MPFR_RNDN);
        mpfr_sin(r26905, r26889, MPFR_RNDN);
        mpfr_mul(r26906, r26888, r26905, MPFR_RNDN);
        mpfr_mul(r26907, r26906, r26906, MPFR_RNDN);
        mpfr_sub(r26908, r26904, r26907, MPFR_RNDN);
        mpfr_sin(r26909, r26899, MPFR_RNDN);
        mpfr_mul(r26910, r26897, r26909, MPFR_RNDN);
        mpfr_mul(r26911, r26908, r26910, MPFR_RNDN);
        mpfr_mul(r26912, r26891, r26890, MPFR_RNDN);
        mpfr_mul(r26913, r26888, r26893, MPFR_RNDN);
        mpfr_add(r26914, r26912, r26913, MPFR_RNDN);
        mpfr_div(r26915, r26911, r26914, MPFR_RNDN);
        mpfr_sub(r26916, r26902, r26915, MPFR_RNDN);
        mpfr_atan2(r26917, r26898, r26916, MPFR_RNDN);
        return mpfr_get_d(r26917, MPFR_RNDN);
}

static mpfr_t r26918, r26919, r26920, r26921, r26922, r26923, r26924, r26925, r26926, r26927, r26928, r26929, r26930, r26931, r26932, r26933, r26934, r26935, r26936, r26937, r26938, r26939, r26940, r26941, r26942, r26943, r26944, r26945, r26946, r26947, r26948;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26918);
        mpfr_init(r26919);
        mpfr_init(r26920);
        mpfr_init(r26921);
        mpfr_init(r26922);
        mpfr_init(r26923);
        mpfr_init(r26924);
        mpfr_init(r26925);
        mpfr_init(r26926);
        mpfr_init(r26927);
        mpfr_init(r26928);
        mpfr_init(r26929);
        mpfr_init(r26930);
        mpfr_init(r26931);
        mpfr_init(r26932);
        mpfr_init(r26933);
        mpfr_init(r26934);
        mpfr_init(r26935);
        mpfr_init(r26936);
        mpfr_init(r26937);
        mpfr_init(r26938);
        mpfr_init(r26939);
        mpfr_init(r26940);
        mpfr_init(r26941);
        mpfr_init(r26942);
        mpfr_init(r26943);
        mpfr_init(r26944);
        mpfr_init(r26945);
        mpfr_init(r26946);
        mpfr_init(r26947);
        mpfr_init(r26948);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26918, lambda1, MPFR_RNDN);
        mpfr_sin(r26919, r26918, MPFR_RNDN);
        mpfr_set_d(r26920, lambda2, MPFR_RNDN);
        mpfr_cos(r26921, r26920, MPFR_RNDN);
        mpfr_cos(r26922, r26918, MPFR_RNDN);
        mpfr_neg(r26923, r26920, MPFR_RNDN);
        mpfr_sin(r26924, r26923, MPFR_RNDN);
        mpfr_mul(r26925, r26922, r26924, MPFR_RNDN);
        mpfr_fma(r26926, r26919, r26921, r26925, MPFR_RNDN);
        mpfr_set_d(r26927, phi2, MPFR_RNDN);
        mpfr_cos(r26928, r26927, MPFR_RNDN);
        mpfr_mul(r26929, r26926, r26928, MPFR_RNDN);
        mpfr_set_d(r26930, phi1, MPFR_RNDN);
        mpfr_cos(r26931, r26930, MPFR_RNDN);
        mpfr_sin(r26932, r26927, MPFR_RNDN);
        mpfr_mul(r26933, r26931, r26932, MPFR_RNDN);
        mpfr_mul(r26934, r26921, r26922, MPFR_RNDN);
        mpfr_mul(r26935, r26934, r26934, MPFR_RNDN);
        mpfr_sin(r26936, r26920, MPFR_RNDN);
        mpfr_mul(r26937, r26919, r26936, MPFR_RNDN);
        mpfr_mul(r26938, r26937, r26937, MPFR_RNDN);
        mpfr_sub(r26939, r26935, r26938, MPFR_RNDN);
        mpfr_sin(r26940, r26930, MPFR_RNDN);
        mpfr_mul(r26941, r26928, r26940, MPFR_RNDN);
        mpfr_mul(r26942, r26939, r26941, MPFR_RNDN);
        mpfr_mul(r26943, r26922, r26921, MPFR_RNDN);
        mpfr_mul(r26944, r26919, r26924, MPFR_RNDN);
        mpfr_add(r26945, r26943, r26944, MPFR_RNDN);
        mpfr_div(r26946, r26942, r26945, MPFR_RNDN);
        mpfr_sub(r26947, r26933, r26946, MPFR_RNDN);
        mpfr_atan2(r26948, r26929, r26947, MPFR_RNDN);
        return mpfr_get_d(r26948, MPFR_RNDN);
}

