/* Generated by Frama-C */
#include "stddef.h"
#include "stdio.h"
extern int __e_acsl_sound_verdict;

/*@ ensures \let delta = 1;
      \let avg_real = (\old(a) + \old(b)) / 2;
        avg_real - delta < \result < avg_real + delta;
 */
double __gen_e_acsl_avg(double a, double b);

double avg(double a, double b)
{
  double __retres;
  __retres = (a + b) / (double)2;
  return __retres;
}

int main(void)
{
  int __retres;
  {
    __e_acsl_mpq_t __gen_e_acsl_;
    __e_acsl_mpq_t __gen_e_acsl__2;
    __e_acsl_mpq_t __gen_e_acsl__3;
    __e_acsl_mpq_t __gen_e_acsl_add;
    int __gen_e_acsl_eq;
    __gmpq_init(__gen_e_acsl_);
    __gmpq_set_str(__gen_e_acsl_,"3",10);
    __gmpq_init(__gen_e_acsl__2);
    __gmpq_set_d(__gen_e_acsl__2,1.5);
    __gmpq_init(__gen_e_acsl__3);
    __gmpq_set_d(__gen_e_acsl__3,1.5);
    __gmpq_init(__gen_e_acsl_add);
    __gmpq_add(__gen_e_acsl_add,
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__2),
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__3));
    __gen_e_acsl_eq = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_),
                                 (__e_acsl_mpq_struct const *)(__gen_e_acsl_add));
    __e_acsl_assert(__gen_e_acsl_eq == 0,"Assertion","main","3 == 1.5 + 1.5",
                    "tests/arith/rationals.c",12);
    __gmpq_clear(__gen_e_acsl_);
    __gmpq_clear(__gen_e_acsl__2);
    __gmpq_clear(__gen_e_acsl__3);
    __gmpq_clear(__gen_e_acsl_add);
  }
  /*@ assert 3 ≡ 1.5 + 1.5; */ ;
  {
    __e_acsl_mpq_t __gen_e_acsl__4;
    int __gen_e_acsl_eq_2;
    __gmpq_init(__gen_e_acsl__4);
    __gmpq_set_str(__gen_e_acsl__4,"01/10",10);
    __gen_e_acsl_eq_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__4),
                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl__4));
    __e_acsl_assert(__gen_e_acsl_eq_2 == 0,"Assertion","main","0.1 == 0.1",
                    "tests/arith/rationals.c",13);
    __gmpq_clear(__gen_e_acsl__4);
  }
  /*@ assert 0.1 ≡ 0.1; */ ;
  __e_acsl_assert(1,"Assertion","main","1.0 == 1.0",
                  "tests/arith/rationals.c",14);
  /*@ assert 1.0 ≡ 1.0; */ ;
  {
    __e_acsl_mpq_t __gen_e_acsl__5;
    double __gen_e_acsl__6;
    __e_acsl_mpq_t __gen_e_acsl__7;
    int __gen_e_acsl_ne;
    __gmpq_init(__gen_e_acsl__5);
    __gmpq_set_str(__gen_e_acsl__5,"01/10",10);
    __gen_e_acsl__6 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__5));
    __gmpq_init(__gen_e_acsl__7);
    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__6); */
    __gmpq_set_d(__gen_e_acsl__7,__gen_e_acsl__6);
    __gen_e_acsl_ne = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__7),
                                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__5));
    __e_acsl_assert(__gen_e_acsl_ne != 0,"Assertion","main",
                    "(double)0.1 != 0.1","tests/arith/rationals.c",15);
    __gmpq_clear(__gen_e_acsl__5);
    __gmpq_clear(__gen_e_acsl__7);
  }
  /*@ assert (double)0.1 ≢ 0.1; */ ;
  {
    __e_acsl_mpq_t __gen_e_acsl__8;
    double __gen_e_acsl__9;
    double __gen_e_acsl__10;
    __gmpq_init(__gen_e_acsl__8);
    __gmpq_set_str(__gen_e_acsl__8,"01/10",10);
    __gen_e_acsl__9 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__8));
    __gen_e_acsl__10 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__8));
    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__9); */
    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__10); */
    /*@ assert Eva: is_nan_or_infinite: \is_finite((float)__gen_e_acsl__9);
    */
    __e_acsl_assert((double)((float)__gen_e_acsl__9) != __gen_e_acsl__10,
                    "Assertion","main","(float)0.1 != (double)0.1",
                    "tests/arith/rationals.c",16);
    __gmpq_clear(__gen_e_acsl__8);
  }
  /*@ assert (float)0.1 ≢ (double)0.1; */ ;
  {
    __e_acsl_mpq_t __gen_e_acsl__11;
    double __gen_e_acsl__12;
    __e_acsl_mpq_t __gen_e_acsl__13;
    __e_acsl_mpq_t __gen_e_acsl__14;
    __e_acsl_mpq_t __gen_e_acsl_add_2;
    __e_acsl_mpq_t __gen_e_acsl__15;
    int __gen_e_acsl_ne_2;
    __gmpq_init(__gen_e_acsl__11);
    __gmpq_set_str(__gen_e_acsl__11,"11/10",10);
    __gen_e_acsl__12 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__11));
    __gmpq_init(__gen_e_acsl__13);
    __gmpq_set_str(__gen_e_acsl__13,"1",10);
    __gmpq_init(__gen_e_acsl__14);
    __gmpq_set_str(__gen_e_acsl__14,"01/10",10);
    __gmpq_init(__gen_e_acsl_add_2);
    __gmpq_add(__gen_e_acsl_add_2,
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__13),
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__14));
    __gmpq_init(__gen_e_acsl__15);
    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__12); */
    __gmpq_set_d(__gen_e_acsl__15,__gen_e_acsl__12);
    __gen_e_acsl_ne_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__15),
                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_2));
    __e_acsl_assert(__gen_e_acsl_ne_2 != 0,"Assertion","main",
                    "(double)1.1 != 1 + 0.1","tests/arith/rationals.c",17);
    __gmpq_clear(__gen_e_acsl__11);
    __gmpq_clear(__gen_e_acsl__13);
    __gmpq_clear(__gen_e_acsl__14);
    __gmpq_clear(__gen_e_acsl_add_2);
    __gmpq_clear(__gen_e_acsl__15);
  }
  /*@ assert (double)1.1 ≢ 1 + 0.1; */ ;
  {
    __e_acsl_mpq_t __gen_e_acsl__16;
    __e_acsl_mpq_t __gen_e_acsl__17;
    __e_acsl_mpq_t __gen_e_acsl_add_3;
    __e_acsl_mpq_t __gen_e_acsl__18;
    __e_acsl_mpq_t __gen_e_acsl__19;
    __e_acsl_mpq_t __gen_e_acsl_sub;
    int __gen_e_acsl_eq_3;
    __gmpq_init(__gen_e_acsl__16);
    __gmpq_set_str(__gen_e_acsl__16,"1",10);
    __gmpq_init(__gen_e_acsl__17);
    __gmpq_set_str(__gen_e_acsl__17,"01/10",10);
    __gmpq_init(__gen_e_acsl_add_3);
    __gmpq_add(__gen_e_acsl_add_3,
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__16),
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__17));
    __gmpq_init(__gen_e_acsl__18);
    __gmpq_set_str(__gen_e_acsl__18,"2",10);
    __gmpq_init(__gen_e_acsl__19);
    __gmpq_set_str(__gen_e_acsl__19,"09/10",10);
    __gmpq_init(__gen_e_acsl_sub);
    __gmpq_sub(__gen_e_acsl_sub,
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__18),
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__19));
    __gen_e_acsl_eq_3 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_add_3),
                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl_sub));
    __e_acsl_assert(__gen_e_acsl_eq_3 == 0,"Assertion","main",
                    "1 + 0.1 == 2 - 0.9","tests/arith/rationals.c",18);
    __gmpq_clear(__gen_e_acsl__16);
    __gmpq_clear(__gen_e_acsl__17);
    __gmpq_clear(__gen_e_acsl_add_3);
    __gmpq_clear(__gen_e_acsl__18);
    __gmpq_clear(__gen_e_acsl__19);
    __gmpq_clear(__gen_e_acsl_sub);
  }
  /*@ assert 1 + 0.1 ≡ 2 - 0.9; */ ;
  float x = 0.2f;
  float y = 0.3f;
  float sum = x + y;
  {
    __e_acsl_mpq_t __gen_e_acsl_y;
    __e_acsl_mpq_t __gen_e_acsl__20;
    __e_acsl_mpq_t __gen_e_acsl_mul;
    __e_acsl_mpq_t __gen_e_acsl__21;
    int __gen_e_acsl_ne_3;
    __gmpq_init(__gen_e_acsl_y);
    __gmpq_set_d(__gen_e_acsl_y,(double)y);
    __gmpq_init(__gen_e_acsl__20);
    __gmpq_set_d(__gen_e_acsl__20,(double)x);
    __gmpq_init(__gen_e_acsl_mul);
    __gmpq_mul(__gen_e_acsl_mul,
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__20),
               (__e_acsl_mpq_struct const *)(__gen_e_acsl_y));
    __gmpq_init(__gen_e_acsl__21);
    __gmpq_set_d(__gen_e_acsl__21,(double)sum);
    __gen_e_acsl_ne_3 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__21),
                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl_mul));
    __e_acsl_assert(__gen_e_acsl_ne_3 != 0,"Assertion","main","sum != x * y",
                    "tests/arith/rationals.c",22);
    __gmpq_clear(__gen_e_acsl_y);
    __gmpq_clear(__gen_e_acsl__20);
    __gmpq_clear(__gen_e_acsl_mul);
    __gmpq_clear(__gen_e_acsl__21);
  }
  /*@ assert sum ≢ x * y; */ ;
  double d = 0.1;
  __gen_e_acsl_avg(4.3,11.7);
  {
    __e_acsl_mpq_t __gen_e_acsl__22;
    __e_acsl_mpq_t __gen_e_acsl__23;
    __e_acsl_mpq_t __gen_e_acsl_add_4;
    __e_acsl_mpq_t __gen_e_acsl__24;
    int __gen_e_acsl_ne_4;
    __gmpq_init(__gen_e_acsl__22);
    __gmpq_set_str(__gen_e_acsl__22,"1",10);
    __gmpq_init(__gen_e_acsl__23);
    __gmpq_set_str(__gen_e_acsl__23,"01/10",10);
    __gmpq_init(__gen_e_acsl_add_4);
    __gmpq_add(__gen_e_acsl_add_4,
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__22),
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__23));
    __gmpq_init(__gen_e_acsl__24);
    __gmpq_set_d(__gen_e_acsl__24,1.1);
    __gen_e_acsl_ne_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__24),
                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_4));
    __e_acsl_assert(__gen_e_acsl_ne_4 != 0,"Assertion","main",
                    "1.1d != 1 + 0.1","tests/arith/rationals.c",29);
    __gmpq_clear(__gen_e_acsl__22);
    __gmpq_clear(__gen_e_acsl__23);
    __gmpq_clear(__gen_e_acsl_add_4);
    __gmpq_clear(__gen_e_acsl__24);
  }
  /*@ assert 1.1d ≢ 1 + 0.1; */ ;
  short a = (short)1;
  short b = (short)1;
  {
    __e_acsl_mpq_t __gen_e_acsl__25;
    __e_acsl_mpq_t __gen_e_acsl__26;
    __e_acsl_mpq_t __gen_e_acsl_add_5;
    __e_acsl_mpq_t __gen_e_acsl__27;
    __e_acsl_mpq_t __gen_e_acsl__28;
    __e_acsl_mpq_t __gen_e_acsl_sub_2;
    int __gen_e_acsl_gt;
    __gmpq_init(__gen_e_acsl__25);
    __gmpq_set_si(__gen_e_acsl__25,(long)a,1UL);
    __gmpq_init(__gen_e_acsl__26);
    __gmpq_set_si(__gen_e_acsl__26,(long)((int)b),1UL);
    __gmpq_init(__gen_e_acsl_add_5);
    __gmpq_add(__gen_e_acsl_add_5,
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__25),
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__26));
    __gmpq_init(__gen_e_acsl__27);
    __gmpq_set_d(__gen_e_acsl__27,2.);
    __gmpq_init(__gen_e_acsl__28);
    __gmpq_set_d(__gen_e_acsl__28,1.);
    __gmpq_init(__gen_e_acsl_sub_2);
    __gmpq_sub(__gen_e_acsl_sub_2,
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__27),
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__28));
    __gen_e_acsl_gt = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_add_5),
                                 (__e_acsl_mpq_struct const *)(__gen_e_acsl_sub_2));
    __e_acsl_assert(__gen_e_acsl_gt > 0,"Assertion","main","a + b > 2. - 1.",
                    "tests/arith/rationals.c",32);
    __gmpq_clear(__gen_e_acsl__25);
    __gmpq_clear(__gen_e_acsl__26);
    __gmpq_clear(__gen_e_acsl_add_5);
    __gmpq_clear(__gen_e_acsl__27);
    __gmpq_clear(__gen_e_acsl__28);
    __gmpq_clear(__gen_e_acsl_sub_2);
  }
  /*@ assert a + b > 2. - 1.; */ ;
  __retres = 0;
  return __retres;
}

/*@ ensures \let delta = 1;
      \let avg_real = (\old(a) + \old(b)) / 2;
        avg_real - delta < \result < avg_real + delta;
 */
double __gen_e_acsl_avg(double a, double b)
{
  double __gen_e_acsl_at_2;
  __e_acsl_mpq_t __gen_e_acsl_at;
  double __retres;
  __gen_e_acsl_at_2 = b;
  {
    __e_acsl_mpq_t __gen_e_acsl_a;
    __gmpq_init(__gen_e_acsl_a);
    __gmpq_set_d(__gen_e_acsl_a,a);
    __gmpq_init(__gen_e_acsl_at);
    __gmpq_set(__gen_e_acsl_at,(__e_acsl_mpq_struct const *)(__gen_e_acsl_a));
    __gmpq_clear(__gen_e_acsl_a);
  }
  __retres = avg(a,b);
  {
    int __gen_e_acsl_delta;
    __e_acsl_mpq_t __gen_e_acsl_avg_real;
    __e_acsl_mpq_t __gen_e_acsl_;
    __e_acsl_mpq_t __gen_e_acsl_add;
    __e_acsl_mpq_t __gen_e_acsl__2;
    __e_acsl_mpq_t __gen_e_acsl_div;
    __e_acsl_mpq_t __gen_e_acsl_delta_2;
    __e_acsl_mpq_t __gen_e_acsl_sub;
    __e_acsl_mpq_t __gen_e_acsl__3;
    int __gen_e_acsl_lt;
    int __gen_e_acsl_and;
    __gen_e_acsl_delta = 1;
    __gmpq_init(__gen_e_acsl_);
    __gmpq_set_d(__gen_e_acsl_,__gen_e_acsl_at_2);
    __gmpq_init(__gen_e_acsl_add);
    __gmpq_add(__gen_e_acsl_add,
               (__e_acsl_mpq_struct const *)(__gen_e_acsl_at),
               (__e_acsl_mpq_struct const *)(__gen_e_acsl_));
    __gmpq_init(__gen_e_acsl__2);
    __gmpq_set_str(__gen_e_acsl__2,"2",10);
    __gmpq_init(__gen_e_acsl_div);
    __gmpq_div(__gen_e_acsl_div,
               (__e_acsl_mpq_struct const *)(__gen_e_acsl_add),
               (__e_acsl_mpq_struct const *)(__gen_e_acsl__2));
    __gmpq_init(__gen_e_acsl_avg_real);
    __gmpq_set(__gen_e_acsl_avg_real,
               (__e_acsl_mpq_struct const *)(__gen_e_acsl_div));
    __gmpq_init(__gen_e_acsl_delta_2);
    __gmpq_set_si(__gen_e_acsl_delta_2,(long)__gen_e_acsl_delta,1UL);
    __gmpq_init(__gen_e_acsl_sub);
    __gmpq_sub(__gen_e_acsl_sub,
               (__e_acsl_mpq_struct const *)(__gen_e_acsl_avg_real),
               (__e_acsl_mpq_struct const *)(__gen_e_acsl_delta_2));
    __gmpq_init(__gen_e_acsl__3);
    __gmpq_set_d(__gen_e_acsl__3,__retres);
    __gen_e_acsl_lt = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_sub),
                                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__3));
    if (__gen_e_acsl_lt < 0) {
      __e_acsl_mpq_t __gen_e_acsl_delta_3;
      __e_acsl_mpq_t __gen_e_acsl_add_2;
      __e_acsl_mpq_t __gen_e_acsl__4;
      int __gen_e_acsl_lt_2;
      __gmpq_init(__gen_e_acsl_delta_3);
      __gmpq_set_si(__gen_e_acsl_delta_3,(long)__gen_e_acsl_delta,1UL);
      __gmpq_init(__gen_e_acsl_add_2);
      __gmpq_add(__gen_e_acsl_add_2,
                 (__e_acsl_mpq_struct const *)(__gen_e_acsl_avg_real),
                 (__e_acsl_mpq_struct const *)(__gen_e_acsl_delta_3));
      __gmpq_init(__gen_e_acsl__4);
      __gmpq_set_d(__gen_e_acsl__4,__retres);
      __gen_e_acsl_lt_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__4),
                                     (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_2));
      __gen_e_acsl_and = __gen_e_acsl_lt_2 < 0;
      __gmpq_clear(__gen_e_acsl_delta_3);
      __gmpq_clear(__gen_e_acsl_add_2);
      __gmpq_clear(__gen_e_acsl__4);
    }
    else __gen_e_acsl_and = 0;
    __e_acsl_assert(__gen_e_acsl_and,"Postcondition","avg",
                    "\\let delta = 1;\n\\let avg_real = (\\old(a) + \\old(b)) / 2;\n  avg_real - delta < \\result < avg_real + delta",
                    "tests/arith/rationals.c",4);
    __gmpq_clear(__gen_e_acsl_avg_real);
    __gmpq_clear(__gen_e_acsl_);
    __gmpq_clear(__gen_e_acsl_add);
    __gmpq_clear(__gen_e_acsl__2);
    __gmpq_clear(__gen_e_acsl_div);
    __gmpq_clear(__gen_e_acsl_delta_2);
    __gmpq_clear(__gen_e_acsl_sub);
    __gmpq_clear(__gen_e_acsl__3);
    __gmpq_clear(__gen_e_acsl_at);
    return __retres;
  }
}


