#[cfg(feature = "alloc")]
use alloc::vec::Vec;
use core::fmt;
use num_complex::Complex;
use crate::machine::BesselFloat;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Accuracy {
Normal,
Reduced,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct AiryResult<T: BesselFloat> {
pub value: Complex<T>,
pub status: Accuracy,
}
#[cfg(feature = "alloc")]
#[derive(Debug, Clone, PartialEq)]
pub struct BesselResult<T: BesselFloat> {
pub values: Vec<Complex<T>>,
pub underflow_count: usize,
pub status: Accuracy,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Scaling {
Unscaled,
Exponential,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum HankelKind {
First,
Second,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum IkFlag {
I,
K,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum SumOption {
Full,
SkipSum,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum AiryDerivative {
Value,
Derivative,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Error {
InvalidInput,
Overflow,
TotalPrecisionLoss,
ConvergenceFailure,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::InvalidInput => {
write!(f, "invalid input: check z and nu constraints")
}
Error::Overflow => {
write!(f, "overflow: result magnitude exceeds representable range")
}
Error::TotalPrecisionLoss => {
write!(f, "total precision loss: no significant digits remain")
}
Error::ConvergenceFailure => {
write!(
f,
"convergence failure: algorithm did not meet termination criteria"
)
}
}
}
}
impl core::error::Error for Error {}