sig
  type result = { res : float; err : float; }
  type result_e10 = { res_e10 : float; err_e10 : float; e10 : int; }
  type mode = DOUBLE | SIMPLE | APPROX
  external smash : Gsl_fun.result_e10 -> Gsl_fun.result
    = "ml_gsl_sf_result_smash_e"
  type gsl_fun = float -> float
  type gsl_fun_fdf = {
    f : float -> float;
    df : float -> float;
    fdf : float -> float * float;
  }
  type monte_fun = float array -> float
  type multi_fun = x:Gsl_vector.vector -> f:Gsl_vector.vector -> unit
  type multi_fun_fdf = {
    multi_f : x:Gsl_vector.vector -> f:Gsl_vector.vector -> unit;
    multi_df : x:Gsl_vector.vector -> j:Gsl_matrix.matrix -> unit;
    multi_fdf :
      x:Gsl_vector.vector ->
      f:Gsl_vector.vector -> j:Gsl_matrix.matrix -> unit;
  }
  type multim_fun = x:Gsl_vector.vector -> float
  type multim_fun_fdf = {
    multim_f : x:Gsl_vector.vector -> float;
    multim_df : x:Gsl_vector.vector -> g:Gsl_vector.vector -> unit;
    multim_fdf : x:Gsl_vector.vector -> g:Gsl_vector.vector -> float;
  }
end