use std::mem::zeroed;
use enums;
use ffi;
pub fn erf(x: f64) -> f64 {
unsafe { ::ffi::gsl_sf_erf(x) }
}
pub fn erf_e(x: f64) -> (enums::value::Value, ::types::Result) {
let mut result = unsafe { zeroed::<ffi::gsl_sf_result>() };
let ret = unsafe { ffi::gsl_sf_erf_e(x, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
pub fn erfc(x: f64) -> f64 {
unsafe { ::ffi::gsl_sf_erfc(x) }
}
pub fn erfc_e(x: f64) -> (enums::value::Value, ::types::Result) {
let mut result = unsafe { zeroed::<ffi::gsl_sf_result>() };
let ret = unsafe { ffi::gsl_sf_erfc_e(x, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
pub fn log_erfc(x: f64) -> f64 {
unsafe { ::ffi::gsl_sf_log_erfc(x) }
}
pub fn log_erfc_e(x: f64) -> (enums::value::Value, ::types::Result) {
let mut result = unsafe { zeroed::<ffi::gsl_sf_result>() };
let ret = unsafe { ffi::gsl_sf_log_erfc_e(x, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
pub fn erf_Z(x: f64) -> f64 {
unsafe { ::ffi::gsl_sf_erf_Z(x) }
}
pub fn erf_Z_e(x: f64) -> (enums::value::Value, ::types::Result) {
let mut result = unsafe { zeroed::<ffi::gsl_sf_result>() };
let ret = unsafe { ffi::gsl_sf_erf_Z_e(x, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
pub fn erf_Q(x: f64) -> f64 {
unsafe { ::ffi::gsl_sf_erf_Q(x) }
}
pub fn erf_Q_e(x: f64) -> (enums::value::Value, ::types::Result) {
let mut result = unsafe { zeroed::<ffi::gsl_sf_result>() };
let ret = unsafe { ffi::gsl_sf_erf_Q_e(x, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
pub fn hazard(x: f64) -> f64 {
unsafe { ::ffi::gsl_sf_hazard(x) }
}
pub fn hazard_e(x: f64) -> (enums::value::Value, ::types::Result) {
let mut result = unsafe { zeroed::<ffi::gsl_sf_result>() };
let ret = unsafe { ffi::gsl_sf_hazard_e(x, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
pub fn str_error(error: ::Value) -> &'static str {
match error {
::Value::Success => "Success",
::Value::Failure => "Failure",
::Value::Continue => "The iteration has not converged yet",
::Value::Dom => "Input domain error",
::Value::Range => "Output range error",
::Value::Fault => "Invalid pointer",
::Value::Inval => "Invalid argument supplied by user",
::Value::Failed => "generic failure",
::Value::Factor => "Factorization failed",
::Value::Sanity => "Sanity check failed - shouldn't happen",
::Value::NoMem => "Malloc failed",
::Value::BadFunc => "Problem with user-supplied function",
::Value::RunAway => "Iterative process is out of control",
::Value::MaxIter => "Exceeded max number of iterations",
::Value::ZeroDiv => "Tried to divide by zero",
::Value::BadTol => "Specified tolerance is invalid or theoretically unattainable",
::Value::Tol => "Failed to reach the specified tolerance",
::Value::UndrFlw => "Underflow",
::Value::OvrFlw => "Overflow",
::Value::Loss => "Loss of accuracy",
::Value::Round => "Roundoff error",
::Value::BadLen => "Matrix/vector sizes are not conformant",
::Value::NotSqr => "Matrix not square",
::Value::Sing => "Singularity or extremely bad function behavior detected",
::Value::Diverge => "Integral or series is divergent",
::Value::Unsup => "The required feature is not supported by this hardware platform",
::Value::Unimpl => "The requested feature is not (yet) implemented",
::Value::Cache => "Cache limit exceeded",
::Value::Table => "Table limit exceeded",
::Value::NoProg => "Iteration is not making progress towards solution",
::Value::NoProgJ => "Jacobian evaluations are not improving the solution",
::Value::TolF => "Cannot reach the specified tolerance in F",
::Value::TolX => "Cannot reach the specified tolerance in X",
::Value::TolG => "Cannot reach the specified tolerance in gradient",
::Value::EOF => "End of file"
}
}