1use core::ops::{AddAssign, DivAssign, MulAssign, SubAssign};
2
3use nalgebra::RealField;
4
5pub trait FlightFloat:
6 RealField
7 + Copy
8 + PartialOrd
9 + Default
10 + AddAssign
11 + SubAssign
12 + MulAssign
13 + DivAssign
14 + core::fmt::Debug
15 + 'static
16{
17 fn from_f32(value: f32) -> Self;
18 fn from_f64(value: f64) -> Self;
19 fn from_usize(value: usize) -> Self;
20 fn from_u64(value: u64) -> Self;
21 fn from_i32(value: i32) -> Self;
22 fn from_flight_float<T: FlightFloat>(value: T) -> Self;
23 fn to_f32_lossy(self) -> f32;
24 fn to_f64_lossy(self) -> f64;
25 fn is_finite_value(self) -> bool;
26 fn infinity() -> Self;
27}
28
29impl FlightFloat for f32 {
30 fn from_f32(value: f32) -> Self {
31 value
32 }
33
34 fn from_f64(value: f64) -> Self {
35 value as f32
36 }
37
38 fn from_usize(value: usize) -> Self {
39 value as f32
40 }
41
42 fn from_u64(value: u64) -> Self {
43 value as f32
44 }
45
46 fn from_i32(value: i32) -> Self {
47 value as f32
48 }
49
50 fn from_flight_float<T: FlightFloat>(value: T) -> Self {
51 value.to_f32_lossy()
52 }
53
54 fn to_f32_lossy(self) -> f32 {
55 self
56 }
57
58 fn to_f64_lossy(self) -> f64 {
59 self as f64
60 }
61
62 fn is_finite_value(self) -> bool {
63 self.is_finite()
64 }
65
66 fn infinity() -> Self {
67 f32::INFINITY
68 }
69}
70
71impl FlightFloat for f64 {
72 fn from_f32(value: f32) -> Self {
73 value as f64
74 }
75
76 fn from_f64(value: f64) -> Self {
77 value
78 }
79
80 fn from_usize(value: usize) -> Self {
81 value as f64
82 }
83
84 fn from_u64(value: u64) -> Self {
85 value as f64
86 }
87
88 fn from_i32(value: i32) -> Self {
89 value as f64
90 }
91
92 fn from_flight_float<T: FlightFloat>(value: T) -> Self {
93 value.to_f64_lossy()
94 }
95
96 fn to_f32_lossy(self) -> f32 {
97 self as f32
98 }
99
100 fn to_f64_lossy(self) -> f64 {
101 self
102 }
103
104 fn is_finite_value(self) -> bool {
105 self.is_finite()
106 }
107
108 fn infinity() -> Self {
109 f64::INFINITY
110 }
111}
112
113pub fn zero<R: FlightFloat>() -> R {
114 <R as FlightFloat>::from_f32(0.0)
115}
116
117pub fn one<R: FlightFloat>() -> R {
118 <R as FlightFloat>::from_f32(1.0)
119}
120
121pub fn pi<R: FlightFloat>() -> R {
122 <R as FlightFloat>::from_f64(core::f64::consts::PI)
123}
124
125pub mod prelude {
126 pub use super::{FlightFloat, one, pi, zero};
127}