From 5dcae6396c6f069be483f9b2c4ef796d184113c2 Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Thu, 18 Mar 2021 13:01:39 +0100 Subject: [PATCH] add 4 constants: SQRT_3, FRAC_1_SQRT_3, GAMMA, CATALAN --- README.md | 10 ++++++++++ RELEASES.md | 10 ++++++++++ src/consts.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/macros_const.rs | 12 ++++++++++++ 4 files changed, 70 insertions(+) diff --git a/README.md b/README.md index a29942f..7324280 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,11 @@ The conversions supported cover the following cases. fixed-point types, to the [`FixedSigned`][tfs-1-7] trait, and to the [`Wrapping`][w-1-7] and [`Unwrapped`][u-1-7] wrappers for signed numbers. + * The following constants were added to the [`consts`][c-1-7] + module and as associated constants for fixed-point types: + * [`SQRT_3`][c-r3-1-7], [`FRAC_1_SQRT_3`][c-1r3-1-7] + * [`GAMMA`][c-g-1-7] + * [`CATALAN`][c-c-1-7] * [`Sum`] and [`Product`] are now supertraits of the [`Fixed`][tf-1-7] trait. * The [`F128Bits`][f128-1-7] type was added to support conversions @@ -124,6 +129,11 @@ The conversions supported cover the following cases. [`Product`]: https://doc.rust-lang.org/nightly/core/iter/trait.Product.html [`Sum`]: https://doc.rust-lang.org/nightly/core/iter/trait.Sum.html +[c-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/consts/index.html +[c-1r3-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/consts/constant.FRAC_1_SQRT_3.html +[c-c-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/consts/constant.CATALAN.html +[c-g-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/consts/constant.GAMMA.html +[c-r3-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/consts/constant.SQRT_3.html [f-cnpot-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedU32.html#method.checked_next_power_of_two [f-fb-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedI32.html#method.from_be [f-fbb-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedI32.html#method.from_be_bytes diff --git a/RELEASES.md b/RELEASES.md index 9d71e8a..94dd688 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -35,6 +35,11 @@ Version 1.7.0 (unreleased) fixed-point types, to the [`FixedSigned`][tfs-1-7] trait, and to the [`Wrapping`][w-1-7] and [`Unwrapped`][u-1-7] wrappers for signed numbers. + * The following constants were added to the [`consts`][c-1-7] + module and as associated constants for fixed-point types: + * [`SQRT_3`][c-r3-1-7], [`FRAC_1_SQRT_3`][c-1r3-1-7] + * [`GAMMA`][c-g-1-7] + * [`CATALAN`][c-c-1-7] * [`Sum`] and [`Product`] are now supertraits of the [`Fixed`][tf-1-7] trait. * The [`F128Bits`][f128-1-7] type was added to support conversions @@ -49,6 +54,11 @@ Version 1.7.0 (unreleased) * [`OverflowingAdd`][nt-0-2-oa], [`OverflowingSub`][nt-0-2-os], [`OverflowingMul`][nt-0-2-om] +[c-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/consts/index.html +[c-1r3-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/consts/constant.FRAC_1_SQRT_3.html +[c-c-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/consts/constant.CATALAN.html +[c-g-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/consts/constant.GAMMA.html +[c-r3-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/consts/constant.SQRT_3.html [f-cnpot-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedU32.html#method.checked_next_power_of_two [f-fb-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedI32.html#method.from_be [f-fbb-1-7]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedI32.html#method.from_be_bytes diff --git a/src/consts.rs b/src/consts.rs index 458154b..3ce7410 100644 --- a/src/consts.rs +++ b/src/consts.rs @@ -102,6 +102,8 @@ fn main() { print("2/√π", "FRAC_2_SQRT_PI", 2 / float(Constant::Pi).sqrt()); print("√2", "SQRT_2", float(2).sqrt()); print("1/√2", "FRAC_1_SQRT_2", float(0.5).sqrt()); + print("√3", "SQRT_3", float(3).sqrt()); + print("1/√3", "FRAC_1_SQRT_3", float(3).recip().sqrt()); print("Euler’s number, e", "E", float(1).exp()); print("log2 10", "LOG2_10", float(10).log2()); print("log2 e", "LOG2_E", float(1).exp().log2()); @@ -111,6 +113,8 @@ fn main() { print("ln 10", "LN_10", float(10).ln()); print("The golden ratio, φ", "PHI", float(1.25).sqrt() + 0.5); print("The golden ratio conjugate, Φ = 1/φ", "FRAC_1_PHI", float(1.25).sqrt() - 0.5); + print("The Euler-Mascheroni constant, γ", "GAMMA", float(Constant::Euler)); + print("Catalan’s constant", "CATALAN", float(Constant::Catalan)); } ``` */ @@ -199,6 +203,14 @@ pub const SQRT_2: U1F127 = U1F127::from_bits(0xB504_F333_F9DE_6484_597D_89B3_754 // FRAC_1_SQRT_2 = 0.7071067811865475244008443621048490392848... pub const FRAC_1_SQRT_2: U0F128 = U0F128::from_bits(0xB504_F333_F9DE_6484_597D_89B3_754A_BE9F); +/// √3 = 1.73205… +// SQRT_3 = 1.732050807568877293527446341505872366942... +pub const SQRT_3: U1F127 = U1F127::from_bits(0xDDB3_D742_C265_539D_92BA_16B8_3C5C_1DC4); + +/// 1/√3 = 0.577350… +// FRAC_1_SQRT_3 = 0.5773502691896257645091487805019574556476... +pub const FRAC_1_SQRT_3: U0F128 = U0F128::from_bits(0x93CD_3A2C_8198_E269_0C7C_0F25_7D92_BE83); + /// Euler’s number, e = 2.71828… // E = 2.718281828459045235360287471352662497757... pub const E: U2F126 = U2F126::from_bits(0xADF8_5458_A2BB_4A9A_AFDC_5620_273D_3CF1); @@ -235,6 +247,14 @@ pub const PHI: U1F127 = U1F127::from_bits(0xCF1B_BCDC_BFA5_3E0A_F9CE_6030_2E76_E // FRAC_1_PHI = 0.6180339887498948482045868343656381177203... pub const FRAC_1_PHI: U0F128 = U0F128::from_bits(0x9E37_79B9_7F4A_7C15_F39C_C060_5CED_C834); +/// The Euler-Mascheroni constant, γ = 0.577215… +// GAMMA = 0.5772156649015328606065120900824024310421... +pub const GAMMA: U0F128 = U0F128::from_bits(0x93C4_67E3_7DB0_C7A4_D1BE_3F81_0152_CB56); + +/// Catalan’s constant = 0.915965… +// CATALAN = 0.9159655941772190150546035149323841107741... +pub const CATALAN: U0F128 = U0F128::from_bits(0xEA7C_B89F_409A_E845_2158_22E3_7D32_D0C6); + #[cfg(test)] #[allow(clippy::float_cmp)] mod tests { @@ -274,6 +294,11 @@ mod tests { assert_eq!(f16::from_fixed(FRAC_2_SQRT_PI), f16::FRAC_2_SQRT_PI); assert_eq!(f16::from_fixed(SQRT_2), f16::SQRT_2); assert_eq!(f16::from_fixed(FRAC_1_SQRT_2), f16::FRAC_1_SQRT_2); + assert_eq!(f16::from_fixed(SQRT_3), f16::from_f32(3f32.sqrt())); + assert_eq!( + f16::from_fixed(FRAC_1_SQRT_3), + f16::from_f32(3f32.powf(-0.5)) + ); assert_eq!(f16::from_fixed(E), f16::E); assert_eq!(f16::from_fixed(LOG2_10), f16::LOG2_10); assert_eq!(f16::from_fixed(LOG2_E), f16::LOG2_E); @@ -318,6 +343,11 @@ mod tests { assert_eq!(bf16::from_fixed(FRAC_2_SQRT_PI), bf16::FRAC_2_SQRT_PI); assert_eq!(bf16::from_fixed(SQRT_2), bf16::SQRT_2); assert_eq!(bf16::from_fixed(FRAC_1_SQRT_2), bf16::FRAC_1_SQRT_2); + assert_eq!(bf16::from_fixed(SQRT_3), bf16::from_f32(3f32.sqrt())); + assert_eq!( + bf16::from_fixed(FRAC_1_SQRT_3), + bf16::from_f32(3f32.powf(-0.5)) + ); assert_eq!(bf16::from_fixed(E), bf16::E); assert_eq!(bf16::from_fixed(LOG2_10), bf16::LOG2_10); assert_eq!(bf16::from_fixed(LOG2_E), bf16::LOG2_E); @@ -355,6 +385,8 @@ mod tests { assert_eq!(f32::from_fixed(FRAC_2_SQRT_PI), f32::consts::FRAC_2_SQRT_PI); assert_eq!(f32::from_fixed(SQRT_2), f32::consts::SQRT_2); assert_eq!(f32::from_fixed(FRAC_1_SQRT_2), f32::consts::FRAC_1_SQRT_2); + assert_eq!(f32::from_fixed(SQRT_3), 3f32.sqrt()); + assert_eq!(f32::from_fixed(FRAC_1_SQRT_3), 3f32.powf(-0.5)); assert_eq!(f32::from_fixed(E), f32::consts::E); assert_eq!(f32::from_fixed(LOG2_10), f32::consts::LOG2_10); assert_eq!(f32::from_fixed(LOG2_E), f32::consts::LOG2_E); @@ -389,6 +421,8 @@ mod tests { assert_eq!(f64::from_fixed(FRAC_2_SQRT_PI), f64::consts::FRAC_2_SQRT_PI); assert_eq!(f64::from_fixed(SQRT_2), f64::consts::SQRT_2); assert_eq!(f64::from_fixed(FRAC_1_SQRT_2), f64::consts::FRAC_1_SQRT_2); + assert_eq!(f64::from_fixed(SQRT_3), 3f64.sqrt()); + assert_eq!(f64::from_fixed(FRAC_1_SQRT_3), 3f64.powf(-0.5)); assert_eq!(f64::from_fixed(E), f64::consts::E); assert_eq!(f64::from_fixed(LOG2_10), f64::consts::LOG2_10); assert_eq!(f64::from_fixed(LOG2_E), f64::consts::LOG2_E); @@ -433,6 +467,8 @@ mod tests { compare_parse(FRAC_2_SQRT_PI, "1.128379167095512573896158903121545171688"); compare_parse(SQRT_2, "1.414213562373095048801688724209698078569"); compare_parse(FRAC_1_SQRT_2, "0.7071067811865475244008443621048490392848"); + compare_parse(SQRT_3, "1.732050807568877293527446341505872366942"); + compare_parse(FRAC_1_SQRT_3, "0.5773502691896257645091487805019574556476"); compare_parse(E, "2.718281828459045235360287471352662497757"); compare_parse(LOG2_10, "3.321928094887362347870319429489390175864"); compare_parse(LOG2_E, "1.442695040888963407359924681001892137426"); @@ -442,5 +478,7 @@ mod tests { compare_parse(LN_10, "2.302585092994045684017991454684364207601"); compare_parse(PHI, "1.618033988749894848204586834365638117720"); compare_parse(FRAC_1_PHI, "0.6180339887498948482045868343656381177203"); + compare_parse(GAMMA, "0.5772156649015328606065120900824024310421"); + compare_parse(CATALAN, "0.9159655941772190150546035149323841107741"); } } diff --git a/src/macros_const.rs b/src/macros_const.rs index 0d4713b..22b24f2 100644 --- a/src/macros_const.rs +++ b/src/macros_const.rs @@ -130,11 +130,20 @@ let _ = Fix::LN_2; /// 1/√2 = 0.707106… pub const FRAC_1_SQRT_2: $Fixed = shift!(FRAC_1_SQRT_2, $Fixed); + /// 1/√3 = 0.577350… + pub const FRAC_1_SQRT_3: $Fixed = shift!(FRAC_1_SQRT_3, $Fixed); + /// ln 2 = 0.693147… pub const LN_2: $Fixed = shift!(LN_2, $Fixed); /// The golden ratio conjugate, Φ = 1/φ = 0.618033… pub const FRAC_1_PHI: $Fixed = shift!(FRAC_1_PHI, $Fixed); + + /// The Euler-Mascheroni constant, γ = 0.577215… + pub const GAMMA: $Fixed = shift!(GAMMA, $Fixed); + + /// Catalan’s constant = 0.915965… + pub const CATALAN: $Fixed = shift!(CATALAN, $Fixed); } } @@ -199,6 +208,9 @@ let _ = Fix::LOG2_E; /// √2 = 1.41421… pub const SQRT_2: $Fixed = shift!(SQRT_2, 127, $Fixed); + /// √3 = 1.73205… + pub const SQRT_3: $Fixed = shift!(SQRT_3, 127, $Fixed); + /// log2 e = 1.44269… pub const LOG2_E: $Fixed = shift!(LOG2_E, 127, $Fixed);