let frama_C_sqrt state actuals =
  match actuals with
    [_, arg, _] -> begin
        let r =
          try
            let i = Cvalue_type.V.project_ival arg in
            let f = Ival.project_float i in
            let result_alarm, f =
              Ival.Float_abstract.sqrt_float (Value_util.get_rounding_mode()) f
            in
            if result_alarm
            then
(*              CilE.warn_result_nan_infinite
                (Value_util.warn_all_quiet_mode ()) ; *)

              Value_parameters.result ~once:true ~current:true
                "float sqrt: assert (Ook)";
            Cvalue_type.V.inject_ival (Ival.inject_float f)

          with
            Cvalue_type.V.Not_based_on_null ->
              Value_parameters.result ~once:true ~current:true
                "float sqrt applied to address";
              Cvalue_type.V.topify_arith_origin arg
          | Ival.Float_abstract.Bottom ->
              ignore (CilE.warn_once "sqrt: TODO -- a proper alarm");
              V.bottom
         in
        (wrap_double r), state, Locations.Location_Bits.Top_Param.bottom
      end
  | _ -> Value_parameters.error
      "Invalid argument for Frama_C_sqrt function";
      Value_util.do_degenerate None;
      raise Db.Value.Aborted