1#[cfg(not(feature = "std"))]
4use alloc::vec::Vec;
5use core::fmt;
6
7use num_complex::Complex;
8
9use crate::machine::BesselFloat;
10
11pub struct BesselResult<T: BesselFloat> {
13 pub values: Vec<Complex<T>>,
15 pub underflow_count: usize,
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq)]
21pub enum Scaling {
22 Unscaled,
24 Exponential,
26}
27
28#[derive(Debug, Clone, Copy, PartialEq, Eq)]
30pub enum HankelKind {
31 First,
33 Second,
35}
36
37#[derive(Debug, Clone, Copy, PartialEq, Eq)]
39pub enum AiryDerivative {
40 Value,
42 Derivative,
44}
45
46#[derive(Debug, Clone, Copy, PartialEq, Eq)]
48pub enum BesselError {
49 InvalidInput,
51 Overflow,
53 PrecisionLoss,
55 TotalPrecisionLoss,
57 ConvergenceFailure,
59}
60
61impl fmt::Display for BesselError {
62 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
63 match self {
64 BesselError::InvalidInput => {
65 write!(f, "invalid input: check z and nu constraints")
66 }
67 BesselError::Overflow => {
68 write!(f, "overflow: result magnitude exceeds representable range")
69 }
70 BesselError::PrecisionLoss => {
71 write!(
72 f,
73 "precision loss: more than half of significant digits lost"
74 )
75 }
76 BesselError::TotalPrecisionLoss => {
77 write!(f, "total precision loss: no significant digits remain")
78 }
79 BesselError::ConvergenceFailure => {
80 write!(
81 f,
82 "convergence failure: algorithm did not meet termination criteria"
83 )
84 }
85 }
86 }
87}
88
89#[cfg(feature = "std")]
90impl std::error::Error for BesselError {}