diff --git a/src/kernel_services/abstract_interp/int_interval.ml b/src/kernel_services/abstract_interp/int_interval.ml
index 828c78cfac4c7e06eb27c3783de72565d6504de5..3cfb032d20f5c2024880f8c6290b974dbad24fcb 100644
--- a/src/kernel_services/abstract_interp/int_interval.ml
+++ b/src/kernel_services/abstract_interp/int_interval.ml
@@ -482,6 +482,20 @@ let neg t =
     ~rem:(Int.e_rem (Int.neg t.rem) t.modu)
     ~modu:t.modu
 
+let abs t =
+  match t.min, t.max with
+  | Some mn, _ when Int.(ge mn zero) -> t
+  | _, Some mx when Int.(le mx zero) -> neg t
+  | _, _ ->
+    let max =
+      match t.min, t.max with
+      | Some mn, Some mx -> Some (Int.(max (neg mn) mx))
+      | _, _ -> None
+    in
+    let modu = Int.(pgcd t.modu (add t.rem t.rem)) in
+    let rem = Int.e_rem t.rem modu in
+    build_interval ~min:(Some Int.zero) ~max ~rem ~modu
+
 type ext_value = Ninf | Pinf | Val of Int.t
 let inject_min = function None -> Ninf | Some m -> Val m
 let inject_max = function None -> Pinf | Some m -> Val m
diff --git a/src/kernel_services/abstract_interp/int_interval.mli b/src/kernel_services/abstract_interp/int_interval.mli
index b91e7aebfbfb9e45134b9641cd95e7618e57f295..39e08eddaaad86f175b0d425c76c57969aab5d13 100644
--- a/src/kernel_services/abstract_interp/int_interval.mli
+++ b/src/kernel_services/abstract_interp/int_interval.mli
@@ -77,6 +77,7 @@ val add_singleton_int: Integer.t -> t -> t
 val add: t -> t -> t
 val add_under: t -> t -> t or_bottom
 val neg: t -> t
+val abs: t -> t
 
 val scale: Integer.t -> t -> t
 val scale_div: pos:bool -> Integer.t -> t -> t
diff --git a/src/kernel_services/abstract_interp/int_set.ml b/src/kernel_services/abstract_interp/int_set.ml
index f6f059f4065b89f95709e24f41a1bbbd958b3ef2..41de93a6ba8128241681d3355269f07652180c93 100644
--- a/src/kernel_services/abstract_interp/int_set.ml
+++ b/src/kernel_services/abstract_interp/int_set.ml
@@ -604,6 +604,13 @@ let add_under s1 s2 =
 
 let neg s = map_set_strict_decr Int.neg s
 
+let abs s =
+  if Int.(ge s.(0) zero)
+  then s
+  else if Int.(le s.(Array.length s - 1) zero)
+  then neg s
+  else map Int.abs s
+
 let scale f s =
   if Int.ge f Int.zero
   then apply_bin_1_strict_incr Int.mul f s
diff --git a/src/kernel_services/abstract_interp/int_set.mli b/src/kernel_services/abstract_interp/int_set.mli
index f9e15b03ca397d8add17e668e1fa4ec8a067ffff..6b81748ffc17c85e24ec1350c4f765a0af7f1989 100644
--- a/src/kernel_services/abstract_interp/int_set.mli
+++ b/src/kernel_services/abstract_interp/int_set.mli
@@ -117,6 +117,7 @@ val add_singleton: Integer.t -> t -> t
 val add: t -> t -> set_or_top
 val add_under: t -> t -> set_or_top
 val neg: t -> t
+val abs: t -> t
 
 val mul: t -> t -> set_or_top
 val c_rem: t -> t -> set_or_top_or_bottom
diff --git a/src/kernel_services/abstract_interp/int_val.ml b/src/kernel_services/abstract_interp/int_val.ml
index 54f11c0cfada4716e729218748f7320c922c19aa..a98c8c40fee00a07cde4017134532cf00c085725 100644
--- a/src/kernel_services/abstract_interp/int_val.ml
+++ b/src/kernel_services/abstract_interp/int_val.ml
@@ -436,6 +436,10 @@ let neg = function
   | Set s -> Set (Int_set.neg s)
   | Itv i -> Itv (Int_interval.neg i)
 
+let abs = function
+  | Set s -> Set (Int_set.abs s)
+  | Itv i -> inject_itv (Int_interval.abs i)
+
 
 let scale f v =
   if Int.is_zero f
diff --git a/src/kernel_services/abstract_interp/int_val.mli b/src/kernel_services/abstract_interp/int_val.mli
index 7a0436d1bc964e9552b112c05a63d6b9beeafb61..64fc2616d1c53f75e7795bb8b932e36d4482ee0f 100644
--- a/src/kernel_services/abstract_interp/int_val.mli
+++ b/src/kernel_services/abstract_interp/int_val.mli
@@ -126,6 +126,9 @@ val add_singleton: Integer.t -> t -> t
 val neg: t -> t
 (** Negation of an integer abstraction. *)
 
+val abs: t -> t
+(** Absolute value of an integer abstraction. *)
+
 val scale: Integer.t -> t -> t
 (** [scale f v] returns an abstraction of the integers [f * x]
     for all [x] in [v]. This operation is exact. *)
diff --git a/src/kernel_services/abstract_interp/ival.ml b/src/kernel_services/abstract_interp/ival.ml
index ed5a471607fd568166ed62b231cdc31b0063231b..54772b1ae81599941154d7328df7c0393b4faaaa 100644
--- a/src/kernel_services/abstract_interp/ival.ml
+++ b/src/kernel_services/abstract_interp/ival.ml
@@ -445,6 +445,11 @@ let neg_int = function
   | Float _ -> assert false
   | Int i -> inject_int (Int_val.neg i)
 
+let abs_int = function
+  | Bottom -> bottom
+  | Float _ -> assert false
+  | Int i -> inject_int (Int_val.abs i)
+
 let sub_int v1 v2 = add_int v1 (neg_int v2)
 let sub_int_under v1 v2 = add_int_under v1 (neg_int v2)
 
diff --git a/src/kernel_services/abstract_interp/ival.mli b/src/kernel_services/abstract_interp/ival.mli
index a9e2654467bb4a6c18936cc3cb991095fbb047bf..d45cc3cf6313f43e6a15337ce15a2858a55260ef 100644
--- a/src/kernel_services/abstract_interp/ival.mli
+++ b/src/kernel_services/abstract_interp/ival.mli
@@ -63,6 +63,8 @@ val add_singleton_int: Integer.t -> t -> t
 
 val neg_int : t -> t
 (** Negation of an integer ival. Exact operation. *)
+val abs_int: t -> t
+(** Absolute value of an integer. *)
 val sub_int : t -> t -> t
 val sub_int_under: t -> t -> t
 
diff --git a/src/plugins/value/legacy/eval_terms.ml b/src/plugins/value/legacy/eval_terms.ml
index 0be07bebce0b237b56a78dee1c2a3781e4f1ca6e..0a0f0efdf3792fdca9fc5fd17c4302adb73de9de 100644
--- a/src/plugins/value/legacy/eval_terms.ml
+++ b/src/plugins/value/legacy/eval_terms.ml
@@ -720,6 +720,7 @@ let known_logic_funs = [
   "\\sign", ACSL;
   "\\min", ACSL;
   "\\max", ACSL;
+  "\\abs", ACSL;
   "\\neg_float",ACSL;
   "\\add_float",ACSL;
   "\\sub_float",ACSL;
@@ -1412,6 +1413,21 @@ and eval_known_logic_function ~alarm_mode env li labels args =
       | _ -> assert false
     end
 
+  | "\\abs", Some typ, _, [t] ->
+    begin
+      let r = eval_term ~alarm_mode env t in
+      try
+        let ival = Cvalue.V.project_ival r.eover in
+        let result =
+          match typ with
+          | Linteger -> einteger (Cvalue.V.inject_ival (Ival.abs_int ival))
+          | Lreal -> ereal Fval.(abs Real (Ival.project_float ival))
+          | _ -> assert false
+        in
+        { result with empty = r.empty; ldeps = r.ldeps; }
+      with Cvalue.V.Not_based_on_null -> c_alarm ()
+    end
+
   | _ -> assert false
 
 and eval_float_builtin_arity2  ~alarm_mode env name arg1 arg2 =
diff --git a/tests/value/logic.c b/tests/value/logic.c
index e5963edcd24c29b6ccdbf20c6bcd2bbff4b0466c..eeea0f321b921cfa138049c8a2c06c30e0ae7e43 100644
--- a/tests/value/logic.c
+++ b/tests/value/logic.c
@@ -354,6 +354,89 @@ void min_max_quantifier () {
   /*@ check unknown: \min(i, j, \lambda integer i; t[i]) >= 0; */
 }
 
+#include <stdint.h>
+
+/*@ assigns \result \from x;
+    ensures \result == \abs(x); */
+int abs (int x);
+
+void int_abs () {
+  /* Singletons. */
+  int zero = abs(0);
+  int ten = abs(10);
+  int eleven = abs(-11);
+  int x;
+  /* Tests the set semantics. */
+  x = Frama_C_interval(-10, -5);
+  x = abs(x);
+  Frama_C_show_each_5_10(x);
+  x = Frama_C_interval(-4, 3);
+  x = abs(x);
+  Frama_C_show_each_0_4(x);
+  /* Tests the interval semantics. */
+  x = Frama_C_interval(10, 100);
+  x = abs(x);
+  Frama_C_show_each_10_100(x);
+  x = Frama_C_interval(0, 100);
+  x = abs(x);
+  Frama_C_show_each_0_100(x);
+  x = Frama_C_interval(-20, -10);
+  x = abs(x);
+  Frama_C_show_each_10_20(x);
+  x = Frama_C_interval(-4, 12);
+  x = abs(x);
+  Frama_C_show_each_0_12(x);
+  x = Frama_C_interval(-16, 16);
+  x = abs(x);
+  Frama_C_show_each_0_16(x);
+   /* Tests the congruence semantics. */
+  x = Frama_C_interval(-20, 20);
+  x = 4 * x + 2;
+  x = abs(x);
+  Frama_C_show_each_2_mod_4(x);
+  x = Frama_C_interval(-20, 20);
+  x = 4 * x + 3;
+  x = abs(x);
+  Frama_C_show_each_1_mod_2(x);
+  x = Frama_C_interval(-12, 5);
+  x = 3 * x + 1;
+  x = abs(x);
+  Frama_C_show_each_no_mod(x);
+  /* Tests small intervals becoming small sets. */
+  x = Frama_C_interval(-5, 5);
+  x = abs(x);
+  Frama_C_show_each_set(x);
+  /* Tests address semantics. */
+  x = (uintptr_t)&x;
+  x = abs(x);
+  Frama_C_show_each_gm(x);
+}
+
+/*@ assigns \result \from f;
+    ensures \is_finite(\result) && \result == \abs(f); */
+double fabs(double f);
+
+void float_abs () {
+  /* Singletons. */
+  double zero = fabs(-0.);
+  double ten = fabs(10.);
+  double eleven = fabs(-11.);
+  double x;
+  /* Interval semantics. */
+  x = Frama_C_double_interval(-0., 0.);
+  x = fabs(x);
+  Frama_C_show_each_zero(x);
+  x = Frama_C_double_interval(0.5, 2.);
+  x = fabs(x);
+  Frama_C_show_each_half_two(x);
+  x = Frama_C_double_interval(-10., -0.);
+  x = fabs(x);
+  Frama_C_show_each_0_10(x);
+  x = Frama_C_double_interval(-3., 1.5);
+  x = fabs(x);
+  Frama_C_show_each_0_3(x);
+}
+
 void main () {
   eq_tsets();
   eq_char();
@@ -368,4 +451,6 @@ void main () {
   assign_tsets();
   check_and_assert ();
   min_max_quantifier ();
+  int_abs();
+  float_abs();
 }
diff --git a/tests/value/oracle/logic.res.oracle b/tests/value/oracle/logic.res.oracle
index 7f1e124d0e9ada972519f8652deac34560e17adb..069377d7cf41cf998dad89d491ccbd8e64839ca3 100644
--- a/tests/value/oracle/logic.res.oracle
+++ b/tests/value/oracle/logic.res.oracle
@@ -14,7 +14,7 @@
   arr_ptr[0..2] ∈ {0}
   arr_ptr_arr[0..5] ∈ {0}
 [eva] computing for function eq_tsets <- main.
-  Called from tests/value/logic.c:358.
+  Called from tests/value/logic.c:441.
 [eva] tests/value/logic.c:103: 
   cannot evaluate ACSL term, unsupported ACSL construct: == operation on non-supported type set<_#8>
 [eva:alarm] tests/value/logic.c:103: Warning: assertion got status unknown.
@@ -56,20 +56,20 @@
 [eva] Recording results for eq_tsets
 [eva] Done for function eq_tsets
 [eva] computing for function eq_char <- main.
-  Called from tests/value/logic.c:359.
+  Called from tests/value/logic.c:442.
 [eva] tests/value/logic.c:149: Frama_C_show_each: {-126}
 [eva] tests/value/logic.c:150: assertion got status valid.
 [eva] tests/value/logic.c:151: assertion got status valid.
 [eva] Recording results for eq_char
 [eva] Done for function eq_char
 [eva] computing for function casts <- main.
-  Called from tests/value/logic.c:360.
+  Called from tests/value/logic.c:443.
 [eva] tests/value/logic.c:155: assertion got status valid.
 [eva] tests/value/logic.c:156: assertion got status valid.
 [eva] Recording results for casts
 [eva] Done for function casts
 [eva] computing for function empty_tset <- main.
-  Called from tests/value/logic.c:361.
+  Called from tests/value/logic.c:444.
 [eva] computing for function f_empty_tset <- empty_tset <- main.
   Called from tests/value/logic.c:166.
 [eva] using specification for function f_empty_tset
@@ -82,7 +82,7 @@
 [eva] Recording results for empty_tset
 [eva] Done for function empty_tset
 [eva] computing for function reduce_by_equal <- main.
-  Called from tests/value/logic.c:362.
+  Called from tests/value/logic.c:445.
 [eva:alarm] tests/value/logic.c:172: Warning: 
   accessing out of bounds index. assert 0 ≤ v;
 [eva:alarm] tests/value/logic.c:172: Warning: 
@@ -92,7 +92,7 @@
 [eva] Recording results for reduce_by_equal
 [eva] Done for function reduce_by_equal
 [eva] computing for function alarms <- main.
-  Called from tests/value/logic.c:363.
+  Called from tests/value/logic.c:446.
 [eva:alarm] tests/value/logic.c:182: Warning: 
   assertion 'ASSUME' got status unknown.
 [eva:alarm] tests/value/logic.c:184: Warning: 
@@ -124,7 +124,7 @@
 [eva] Recording results for alarms
 [eva] Done for function alarms
 [eva] computing for function cond_in_lval <- main.
-  Called from tests/value/logic.c:364.
+  Called from tests/value/logic.c:447.
 [eva] computing for function select_like <- cond_in_lval <- main.
   Called from tests/value/logic.c:228.
 [eva] using specification for function select_like
@@ -152,7 +152,7 @@
 [eva] Recording results for cond_in_lval
 [eva] Done for function cond_in_lval
 [eva] computing for function pred <- main.
-  Called from tests/value/logic.c:365.
+  Called from tests/value/logic.c:448.
 [eva] tests/value/logic.c:90: assertion got status valid.
 [eva] tests/value/logic.c:91: assertion got status valid.
 [eva] tests/value/logic.c:31: 
@@ -201,7 +201,7 @@
 [eva] Recording results for pred
 [eva] Done for function pred
 [eva] computing for function float_sign <- main.
-  Called from tests/value/logic.c:366.
+  Called from tests/value/logic.c:449.
 [eva] tests/value/logic.c:251: assertion got status valid.
 [eva] tests/value/logic.c:252: assertion got status valid.
 [eva] tests/value/logic.c:253: assertion got status valid.
@@ -210,7 +210,7 @@
 [eva] Recording results for float_sign
 [eva] Done for function float_sign
 [eva] computing for function min_max <- main.
-  Called from tests/value/logic.c:367.
+  Called from tests/value/logic.c:450.
 [eva] computing for function Frama_C_interval <- min_max <- main.
   Called from tests/value/logic.c:274.
 [eva] using specification for function Frama_C_interval
@@ -235,7 +235,7 @@
 [eva] Recording results for min_max
 [eva] Done for function min_max
 [eva] computing for function assign_tsets <- main.
-  Called from tests/value/logic.c:368.
+  Called from tests/value/logic.c:451.
 [eva] computing for function assign_tsets_aux <- assign_tsets <- main.
   Called from tests/value/logic.c:269.
 [eva] using specification for function assign_tsets_aux
@@ -243,7 +243,7 @@
 [eva] Recording results for assign_tsets
 [eva] Done for function assign_tsets
 [eva] computing for function check_and_assert <- main.
-  Called from tests/value/logic.c:369.
+  Called from tests/value/logic.c:452.
 [eva:alarm] tests/value/logic.c:295: Warning: assertion got status unknown.
 [eva] tests/value/logic.c:296: Frama_C_show_each_42: {42}
 [eva] tests/value/logic.c:297: check got status valid.
@@ -258,7 +258,7 @@
 [eva] Recording results for check_and_assert
 [eva] Done for function check_and_assert
 [eva] computing for function min_max_quantifier <- main.
-  Called from tests/value/logic.c:370.
+  Called from tests/value/logic.c:453.
 [eva] tests/value/logic.c:321: check 'valid' got status valid.
 [eva] tests/value/logic.c:322: check 'valid' got status valid.
 [eva] tests/value/logic.c:323: check 'valid' got status valid.
@@ -331,6 +331,188 @@
   check 'unknown' got status unknown.
 [eva] Recording results for min_max_quantifier
 [eva] Done for function min_max_quantifier
+[eva] computing for function int_abs <- main.
+  Called from tests/value/logic.c:454.
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:365.
+[eva] using specification for function abs
+[eva] Done for function abs
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:366.
+[eva] Done for function abs
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:367.
+[eva] Done for function abs
+[eva] computing for function Frama_C_interval <- int_abs <- main.
+  Called from tests/value/logic.c:370.
+[eva] tests/value/logic.c:370: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:371.
+[eva] Done for function abs
+[eva] tests/value/logic.c:372: Frama_C_show_each_5_10: {5; 6; 7; 8; 9; 10}
+[eva] computing for function Frama_C_interval <- int_abs <- main.
+  Called from tests/value/logic.c:373.
+[eva] tests/value/logic.c:373: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:374.
+[eva] Done for function abs
+[eva] tests/value/logic.c:375: Frama_C_show_each_0_4: {0; 1; 2; 3; 4}
+[eva] computing for function Frama_C_interval <- int_abs <- main.
+  Called from tests/value/logic.c:377.
+[eva] tests/value/logic.c:377: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:378.
+[eva] Done for function abs
+[eva] tests/value/logic.c:379: Frama_C_show_each_10_100: [10..100]
+[eva] computing for function Frama_C_interval <- int_abs <- main.
+  Called from tests/value/logic.c:380.
+[eva] tests/value/logic.c:380: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:381.
+[eva] Done for function abs
+[eva] tests/value/logic.c:382: Frama_C_show_each_0_100: [0..100]
+[eva] computing for function Frama_C_interval <- int_abs <- main.
+  Called from tests/value/logic.c:383.
+[eva] tests/value/logic.c:383: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:384.
+[eva] Done for function abs
+[eva] tests/value/logic.c:385: Frama_C_show_each_10_20: [10..20]
+[eva] computing for function Frama_C_interval <- int_abs <- main.
+  Called from tests/value/logic.c:386.
+[eva] tests/value/logic.c:386: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:387.
+[eva] Done for function abs
+[eva] tests/value/logic.c:388: Frama_C_show_each_0_12: [0..12]
+[eva] computing for function Frama_C_interval <- int_abs <- main.
+  Called from tests/value/logic.c:389.
+[eva] tests/value/logic.c:389: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:390.
+[eva] Done for function abs
+[eva] tests/value/logic.c:391: Frama_C_show_each_0_16: [0..16]
+[eva] computing for function Frama_C_interval <- int_abs <- main.
+  Called from tests/value/logic.c:393.
+[eva] tests/value/logic.c:393: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:395.
+[eva] Done for function abs
+[eva] tests/value/logic.c:396: Frama_C_show_each_2_mod_4: [2..82],2%4
+[eva] computing for function Frama_C_interval <- int_abs <- main.
+  Called from tests/value/logic.c:397.
+[eva] tests/value/logic.c:397: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:399.
+[eva] Done for function abs
+[eva] tests/value/logic.c:400: Frama_C_show_each_1_mod_2: [1..83],1%2
+[eva] computing for function Frama_C_interval <- int_abs <- main.
+  Called from tests/value/logic.c:401.
+[eva] tests/value/logic.c:401: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:403.
+[eva] Done for function abs
+[eva] tests/value/logic.c:404: Frama_C_show_each_no_mod: [0..35]
+[eva] computing for function Frama_C_interval <- int_abs <- main.
+  Called from tests/value/logic.c:406.
+[eva] tests/value/logic.c:406: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:407.
+[eva] Done for function abs
+[eva] tests/value/logic.c:408: Frama_C_show_each_set: {0; 1; 2; 3; 4; 5}
+[eva] computing for function abs <- int_abs <- main.
+  Called from tests/value/logic.c:411.
+[eva] Done for function abs
+[eva] tests/value/logic.c:411: 
+  Assigning imprecise value to x_0.
+  The imprecision originates from Library function {tests/value/logic.c:411}
+[eva] tests/value/logic.c:412: 
+  Frama_C_show_each_gm:
+  {{ garbled mix of &{x_0}
+  (origin: Library function {tests/value/logic.c:411}) }}
+[eva] Recording results for int_abs
+[eva] Done for function int_abs
+[eva] computing for function float_abs <- main.
+  Called from tests/value/logic.c:455.
+[eva] computing for function fabs <- float_abs <- main.
+  Called from tests/value/logic.c:421.
+[eva] using specification for function fabs
+[eva] Done for function fabs
+[eva] computing for function fabs <- float_abs <- main.
+  Called from tests/value/logic.c:422.
+[eva] Done for function fabs
+[eva] computing for function fabs <- float_abs <- main.
+  Called from tests/value/logic.c:423.
+[eva] Done for function fabs
+[eva] computing for function Frama_C_double_interval <- float_abs <- main.
+  Called from tests/value/logic.c:426.
+[eva] using specification for function Frama_C_double_interval
+[eva] tests/value/logic.c:426: 
+  function Frama_C_double_interval: precondition 'finite' got status valid.
+[eva] tests/value/logic.c:426: 
+  function Frama_C_double_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_double_interval
+[eva] computing for function fabs <- float_abs <- main.
+  Called from tests/value/logic.c:427.
+[eva] Done for function fabs
+[eva] tests/value/logic.c:428: Frama_C_show_each_zero: [-0. .. 0.]
+[eva] computing for function Frama_C_double_interval <- float_abs <- main.
+  Called from tests/value/logic.c:429.
+[eva] tests/value/logic.c:429: 
+  function Frama_C_double_interval: precondition 'finite' got status valid.
+[eva] tests/value/logic.c:429: 
+  function Frama_C_double_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_double_interval
+[eva] computing for function fabs <- float_abs <- main.
+  Called from tests/value/logic.c:430.
+[eva] Done for function fabs
+[eva] tests/value/logic.c:431: Frama_C_show_each_half_two: [0.5 .. 2.]
+[eva] computing for function Frama_C_double_interval <- float_abs <- main.
+  Called from tests/value/logic.c:432.
+[eva] tests/value/logic.c:432: 
+  function Frama_C_double_interval: precondition 'finite' got status valid.
+[eva] tests/value/logic.c:432: 
+  function Frama_C_double_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_double_interval
+[eva] computing for function fabs <- float_abs <- main.
+  Called from tests/value/logic.c:433.
+[eva] Done for function fabs
+[eva] tests/value/logic.c:434: Frama_C_show_each_0_10: [-0. .. 10.]
+[eva] computing for function Frama_C_double_interval <- float_abs <- main.
+  Called from tests/value/logic.c:435.
+[eva] tests/value/logic.c:435: 
+  function Frama_C_double_interval: precondition 'finite' got status valid.
+[eva] tests/value/logic.c:435: 
+  function Frama_C_double_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_double_interval
+[eva] computing for function fabs <- float_abs <- main.
+  Called from tests/value/logic.c:436.
+[eva] Done for function fabs
+[eva] tests/value/logic.c:437: Frama_C_show_each_0_3: [-0. .. 3.]
+[eva] Recording results for float_abs
+[eva] Done for function float_abs
 [eva] Recording results for main
 [eva] done for function main
 [scope:rm_asserts] removing 5 assertion(s)
@@ -358,6 +540,12 @@
   temp_2 ∈ {0}
 [eva:final-states] Values at end of function empty_tset:
   T[0] ∈ {2}
+[eva:final-states] Values at end of function float_abs:
+  Frama_C_entropy_source ∈ [--..--]
+  zero ∈ [-0. .. 0.]
+  ten ∈ {10.}
+  eleven ∈ {11.}
+  x_0 ∈ [-0. .. 3.]
 [eva:final-states] Values at end of function float_sign:
   d ∈ [-0. .. 0.]
 [eva:final-states] Values at end of function g:
@@ -372,6 +560,14 @@
   j ∈ {6}
   p ∈ {{ &k }}
   q ∈ {{ &j }}
+[eva:final-states] Values at end of function int_abs:
+  Frama_C_entropy_source ∈ [--..--]
+  zero ∈ {0}
+  ten ∈ {10}
+  eleven ∈ {11}
+  x_0 ∈
+     {{ garbled mix of &{x_0}
+      (origin: Library function {tests/value/logic.c:411}) }}
 [eva:final-states] Values at end of function min_max:
   Frama_C_entropy_source ∈ [--..--]
   x_0 ∈ [3..17]
@@ -501,15 +697,25 @@
 [from] Computing for function f_empty_tset <-empty_tset
 [from] Done for function f_empty_tset
 [from] Done for function empty_tset
+[from] Computing for function float_abs
+[from] Computing for function fabs <-float_abs
+[from] Done for function fabs
+[from] Computing for function Frama_C_double_interval <-float_abs
+[from] Done for function Frama_C_double_interval
+[from] Done for function float_abs
 [from] Computing for function float_sign
 [from] Done for function float_sign
 [from] Computing for function g
 [from] Done for function g
 [from] Computing for function h
 [from] Done for function h
-[from] Computing for function min_max
-[from] Computing for function Frama_C_interval <-min_max
+[from] Computing for function int_abs
+[from] Computing for function abs <-int_abs
+[from] Done for function abs
+[from] Computing for function Frama_C_interval <-int_abs
 [from] Done for function Frama_C_interval
+[from] Done for function int_abs
+[from] Computing for function min_max
 [from] Done for function min_max
 [from] Computing for function min_max_quantifier
 [from] Done for function min_max_quantifier
@@ -527,9 +733,14 @@
 [from] Done for function main
 [from] ====== DEPENDENCIES COMPUTED ======
   These dependencies hold at termination for the executions that terminate:
+[from] Function Frama_C_double_interval:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
+  \result FROM Frama_C_entropy_source; min; max
 [from] Function Frama_C_interval:
   Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
   \result FROM Frama_C_entropy_source; min; max
+[from] Function abs:
+  \result FROM x
 [from] Function alarms:
   NO EFFECTS
 [from] Function assign_tsets_aux:
@@ -551,12 +762,18 @@
   NO EFFECTS
 [from] Function empty_tset:
   NO EFFECTS
+[from] Function fabs:
+  \result FROM f
+[from] Function float_abs:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
 [from] Function float_sign:
   NO EFFECTS
 [from] Function g:
   NO EFFECTS
 [from] Function h:
   s1.f1 FROM \nothing
+[from] Function int_abs:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
 [from] Function min_max:
   Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
 [from] Function min_max_quantifier:
@@ -613,6 +830,10 @@
     T[0]
 [inout] Inputs for function empty_tset:
     \nothing
+[inout] Out (internal) for function float_abs:
+    Frama_C_entropy_source; zero; ten; eleven; x_0
+[inout] Inputs for function float_abs:
+    Frama_C_entropy_source
 [inout] Out (internal) for function float_sign:
     d; tmp
 [inout] Inputs for function float_sign:
@@ -625,6 +846,10 @@
     s1.f1; x_0; y; k; j; p; q
 [inout] Inputs for function h:
     v
+[inout] Out (internal) for function int_abs:
+    Frama_C_entropy_source; zero; ten; eleven; x_0
+[inout] Inputs for function int_abs:
+    Frama_C_entropy_source
 [inout] Out (internal) for function min_max:
     Frama_C_entropy_source; x_0; y; z; r1; r2; r3; r4; a; b; d
 [inout] Inputs for function min_max: