macro_rules! fixed_const {
(
$Fixed:ident[$s_fixed:expr](
$LeEqU:tt, $s_nbits:expr,
$s_nbits_m1:expr, $s_nbits_m2:expr, $s_nbits_m3:expr, $s_nbits_m4:expr
),
$LeEqU_C0:tt, $LeEqU_C1:tt, $LeEqU_C2:tt, $LeEqU_C3:tt,
$Signedness:tt
) => {
impl<Frac: Unsigned> $Fixed<Frac> {
const fn from_const<SrcFrac: Unsigned>(src: FixedU128<SrcFrac>) -> $Fixed<Frac> {
let right = SrcFrac::U32 - Frac::U32;
let bits128 = if right == 128 {
0
} else {
src.to_bits() >> right
};
$Fixed::from_bits(bits128 as _)
}
}
comment! {
"This block contains constants in the range 0 < <i>x</i> < 0.5.
# Examples
```rust
use fixed::{consts, types::extra::U", $s_nbits, ", ", $s_fixed, "};
type Fix = ", $s_fixed, "<U", $s_nbits, ">;
assert_eq!(Fix::LOG10_2, Fix::from_num(consts::LOG10_2));
```
";
impl<Frac: $LeEqU> $Fixed<Frac> {
pub const FRAC_1_TAU: $Fixed<Frac> = Self::from_const(consts::FRAC_1_TAU);
pub const FRAC_2_TAU: $Fixed<Frac> = Self::from_const(consts::FRAC_2_TAU);
pub const FRAC_PI_8: $Fixed<Frac> = Self::from_const(consts::FRAC_PI_8);
pub const FRAC_1_PI: $Fixed<Frac> = Self::from_const(consts::FRAC_1_PI);
pub const LOG10_2: $Fixed<Frac> = Self::from_const(consts::LOG10_2);
pub const LOG10_E: $Fixed<Frac> = Self::from_const(consts::LOG10_E);
}
}
comment! {
"This block contains constants in the range 0.5 ≤ <i>x</i> < 1",
if_signed_else_empty_str! {
$Signedness;
", and −1.
These constants are not representable in signed fixed-point numbers with less
than 1 integer bit"
},
".
# Examples
```rust
use fixed::{consts, types::extra::U",
if_signed_unsigned!($Signedness, $s_nbits_m1, $s_nbits),
", ", $s_fixed, "};
type Fix = ", $s_fixed, "<U",
if_signed_unsigned!($Signedness, $s_nbits_m1, $s_nbits),
">;
assert_eq!(Fix::LN_2, Fix::from_num(consts::LN_2));
assert!(0.5 <= Fix::LN_2 && Fix::LN_2 < 1);
```
",
if_signed_else_empty_str! {
$Signedness;
"
The following example fails to compile, since the maximum
representable value with ", $s_nbits, " fractional bits and 0 integer
bits is < 0.5.
```rust,compile_fail
use fixed::{consts, types::extra::U", $s_nbits, ", ", $s_fixed, "};
type Fix = ", $s_fixed, "<U", $s_nbits, ">;
let _ = Fix::LN_2;
```
"
};
impl<Frac: Unsigned> $Fixed<Frac>
where
Frac: IsLessOrEqual<$LeEqU_C0, Output = True>,
{
if_signed! {
$Signedness;
comment! {
"Negative one.
# Examples
```rust
use fixed::{types::extra::U", $s_nbits_m1, ", ", $s_fixed, "};
type Fix = ", $s_fixed, "<U", $s_nbits_m1, ">;
assert_eq!(Fix::NEG_ONE, Fix::from_num(-1));
```
The following would fail as
<code>[", $s_fixed, "]<[U", $s_nbits_m1, "]></code>
cannot represent 1, so there is no
<code>[", $s_fixed, "]::<[U", $s_nbits_m1, "]>::[ONE]</code>.
[ONE]: ", $s_fixed, "::ONE
```rust,compile_fail
use fixed::{types::extra::U", $s_nbits_m1, ", ", $s_fixed, "};
const _ERROR: ", $s_fixed, "<U", $s_nbits_m1, "> = ", $s_fixed, "::ONE.unwrapped_neg();
```
";
pub const NEG_ONE: $Fixed<Frac> = Self::from_bits(-1 << Frac::U32);
}
}
pub const FRAC_TAU_8: $Fixed<Frac> = Self::from_const(consts::FRAC_TAU_8);
pub const FRAC_TAU_12: $Fixed<Frac> = Self::from_const(consts::FRAC_TAU_12);
pub const FRAC_4_TAU: $Fixed<Frac> = Self::from_const(consts::FRAC_4_TAU);
pub const FRAC_PI_4: $Fixed<Frac> = Self::from_const(consts::FRAC_PI_4);
pub const FRAC_PI_6: $Fixed<Frac> = Self::from_const(consts::FRAC_PI_6);
pub const FRAC_2_PI: $Fixed<Frac> = Self::from_const(consts::FRAC_2_PI);
pub const FRAC_1_SQRT_PI: $Fixed<Frac> = Self::from_const(consts::FRAC_1_SQRT_PI);
pub const FRAC_1_SQRT_2: $Fixed<Frac> = Self::from_const(consts::FRAC_1_SQRT_2);
pub const FRAC_1_SQRT_3: $Fixed<Frac> = Self::from_const(consts::FRAC_1_SQRT_3);
pub const LN_2: $Fixed<Frac> = Self::from_const(consts::LN_2);
pub const FRAC_1_PHI: $Fixed<Frac> = Self::from_const(consts::FRAC_1_PHI);
pub const GAMMA: $Fixed<Frac> = Self::from_const(consts::GAMMA);
pub const CATALAN: $Fixed<Frac> = Self::from_const(consts::CATALAN);
}
}
comment! {
"This block contains constants in the range 1 ≤ <i>x</i> < 2.
These constants are not representable in ",
if_signed_unsigned!($Signedness, "signed", "unsigned"),
" fixed-point numbers with less than ",
if_signed_unsigned!($Signedness, "2 integer bits", "1 integer bit"),
".
# Examples
```rust
use fixed::{consts, types::extra::U",
if_signed_unsigned!($Signedness, $s_nbits_m2, $s_nbits_m1),
", ", $s_fixed, "};
type Fix = ", $s_fixed, "<U",
if_signed_unsigned!($Signedness, $s_nbits_m2, $s_nbits_m1),
">;
assert_eq!(Fix::LOG2_E, Fix::from_num(consts::LOG2_E));
assert!(1 <= Fix::LOG2_E && Fix::LOG2_E < 2);
```
The following example fails to compile, since the maximum
representable value with ",
if_signed_unsigned!($Signedness, $s_nbits_m1, $s_nbits),
" fractional bits and ",
if_signed_unsigned!($Signedness, "1 integer bit", "0 integer bits"),
" is < 1.
```rust,compile_fail
use fixed::{consts, types::extra::U",
if_signed_unsigned!($Signedness, $s_nbits_m1, $s_nbits),
", ", $s_fixed, "};
type Fix = ", $s_fixed, "<U",
if_signed_unsigned!($Signedness, $s_nbits_m1, $s_nbits),
">;
let _ = Fix::LOG2_E;
```
";
impl<Frac: Unsigned> $Fixed<Frac>
where
Frac: IsLessOrEqual<$LeEqU_C1, Output = True>,
{
comment! {
"One.
# Examples
```rust
use fixed::{types::extra::U4, ", $s_fixed, "};
type Fix = ", $s_fixed, "<U4>;
assert_eq!(Fix::ONE, Fix::from_num(1));
```
";
pub const ONE: $Fixed<Frac> = Self::from_bits(1 << Frac::U32);
}
pub const FRAC_TAU_4: $Fixed<Frac> = Self::from_const(consts::FRAC_TAU_4);
pub const FRAC_TAU_6: $Fixed<Frac> = Self::from_const(consts::FRAC_TAU_6);
pub const FRAC_PI_2: $Fixed<Frac> = Self::from_const(consts::FRAC_PI_2);
pub const FRAC_PI_3: $Fixed<Frac> = Self::from_const(consts::FRAC_PI_3);
pub const SQRT_PI: $Fixed<Frac> = Self::from_const(consts::SQRT_PI);
pub const FRAC_2_SQRT_PI: $Fixed<Frac> = Self::from_const(consts::FRAC_2_SQRT_PI);
pub const SQRT_2: $Fixed<Frac> = Self::from_const(consts::SQRT_2);
pub const SQRT_3: $Fixed<Frac> = Self::from_const(consts::SQRT_3);
pub const SQRT_E: $Fixed<Frac> = Self::from_const(consts::SQRT_E);
pub const LOG2_E: $Fixed<Frac> = Self::from_const(consts::LOG2_E);
pub const PHI: $Fixed<Frac> = Self::from_const(consts::PHI);
pub const SQRT_PHI: $Fixed<Frac> = Self::from_const(consts::SQRT_PHI);
}
}
comment! {
"This block contains constants in the range 2 ≤ <i>x</i> < 4.
These constants are not representable in ",
if_signed_unsigned!($Signedness, "signed", "unsigned"),
" fixed-point numbers with less than ",
if_signed_unsigned!($Signedness, "3", "2"),
" integer bits.
# Examples
```rust
use fixed::{consts, types::extra::U",
if_signed_unsigned!($Signedness, $s_nbits_m3, $s_nbits_m2),
", ", $s_fixed, "};
type Fix = ", $s_fixed, "<U",
if_signed_unsigned!($Signedness, $s_nbits_m3, $s_nbits_m2),
">;
assert_eq!(Fix::E, Fix::from_num(consts::E));
assert!(2 <= Fix::E && Fix::E < 4);
```
The following example fails to compile, since the maximum
representable value with ",
if_signed_unsigned!($Signedness, $s_nbits_m2, $s_nbits_m1),
" fractional bits and ",
if_signed_unsigned!($Signedness, "2 integer bits", "1 integer bit"),
" is < 2.
```rust,compile_fail
use fixed::{consts, types::extra::U",
if_signed_unsigned!($Signedness, $s_nbits_m2, $s_nbits_m1),
", ", $s_fixed, "};
type Fix = ", $s_fixed, "<U",
if_signed_unsigned!($Signedness, $s_nbits_m2, $s_nbits_m1),
">;
let _ = Fix::E;
```
";
impl<Frac: Unsigned> $Fixed<Frac>
where
Frac: IsLessOrEqual<$LeEqU_C2, Output = True>,
{
pub const FRAC_TAU_2: $Fixed<Frac> = Self::from_const(consts::FRAC_TAU_2);
pub const FRAC_TAU_3: $Fixed<Frac> = Self::from_const(consts::FRAC_TAU_3);
pub const PI: $Fixed<Frac> = Self::from_const(consts::PI);
pub const E: $Fixed<Frac> = Self::from_const(consts::E);
pub const LOG2_10: $Fixed<Frac> = Self::from_const(consts::LOG2_10);
pub const LN_10: $Fixed<Frac> = Self::from_const(consts::LN_10);
}
}
comment! {
"This block contains constants in the range 4 ≤ <i>x</i> < 8.
These constants are not representable in ",
if_signed_unsigned!($Signedness, "signed", "unsigned"),
" fixed-point numbers with less than ",
if_signed_unsigned!($Signedness, "4", "3"),
" integer bits.
# Examples
```rust
use fixed::{consts, types::extra::U",
if_signed_unsigned!($Signedness, $s_nbits_m4, $s_nbits_m3),
", ", $s_fixed, "};
type Fix = ", $s_fixed, "<U",
if_signed_unsigned!($Signedness, $s_nbits_m4, $s_nbits_m3),
">;
assert_eq!(Fix::TAU, Fix::from_num(consts::TAU));
assert!(4 <= Fix::TAU && Fix::TAU < 8);
```
The following example fails to compile, since the maximum
representable value with ",
if_signed_unsigned!($Signedness, $s_nbits_m3, $s_nbits_m2),
" fractional bits and ",
if_signed_unsigned!($Signedness, "3", "2"),
" integer bits is < 4.
```rust,compile_fail
use fixed::{consts, types::extra::U",
if_signed_unsigned!($Signedness, $s_nbits_m3, $s_nbits_m2),
", ", $s_fixed, "};
type Fix = ", $s_fixed, "<U",
if_signed_unsigned!($Signedness, $s_nbits_m3, $s_nbits_m2),
">;
let _ = Fix::TAU;
```
";
impl<Frac: Unsigned> $Fixed<Frac>
where
Frac: IsLessOrEqual<$LeEqU_C3, Output = True>,
{
pub const TAU: $Fixed<Frac> = Self::from_const(consts::TAU);
}
}
};
}