pub mod exponential;
pub mod logarithmic;
pub mod spence;
pub mod trigonometric;
use slatec_sys::special as raw;
use super::{SpecialFunctionError, runtime};
fn finite_nonzero(function: &'static str, x: f64) -> Result<(), SpecialFunctionError> {
if x.is_finite() && x != 0.0 && x.abs() <= 20.0 {
Ok(())
} else {
Err(SpecialFunctionError::Domain {
function,
argument: "x",
value: x,
})
}
}
pub fn exponential_integral_e1(x: f64) -> Result<f64, SpecialFunctionError> {
finite_nonzero("exponential_integral_e1", x)?;
let _guard = runtime::lock_fnlib();
let mut x = x;
Ok(unsafe { raw::de1(&mut x) })
}
pub fn exponential_integral_ei(x: f64) -> Result<f64, SpecialFunctionError> {
finite_nonzero("exponential_integral_ei", x)?;
let _guard = runtime::lock_fnlib();
let mut x = x;
Ok(unsafe { raw::dei(&mut x) })
}
#[cfg(feature = "special-f32")]
fn finite_nonzero_f32(function: &'static str, x: f32) -> Result<(), SpecialFunctionError> {
if x.is_finite() && x != 0.0 && x.abs() <= 20.0 {
Ok(())
} else {
Err(SpecialFunctionError::Domain {
function,
argument: "x",
value: f64::from(x),
})
}
}
#[cfg(feature = "special-f32")]
pub fn exponential_integral_e1_f32(x: f32) -> Result<f32, SpecialFunctionError> {
finite_nonzero_f32("exponential_integral_e1_f32", x)?;
let _guard = runtime::lock_fnlib();
let mut x = x;
Ok(unsafe { raw::e1(&mut x) })
}
#[cfg(feature = "special-f32")]
pub fn exponential_integral_ei_f32(x: f32) -> Result<f32, SpecialFunctionError> {
finite_nonzero_f32("exponential_integral_ei_f32", x)?;
let _guard = runtime::lock_fnlib();
let mut x = x;
Ok(unsafe { raw::ei(&mut x) })
}