add mul_add to Wrapping and Unwrapped
This commit is contained in:
parent
88f67dc43d
commit
0aa8af089f
|
@ -80,8 +80,8 @@ The conversions supported cover the following cases.
|
||||||
|
|
||||||
### Version 1.3.0 news (unreleased)
|
### Version 1.3.0 news (unreleased)
|
||||||
|
|
||||||
* The following methods were added to all fixed-point types and to
|
* The following methods were added to all fixed-point types, to the
|
||||||
the `Fixed` trait:
|
[`Fixed`][tf-1-3] trait, and to the [`Wrapping`][w-1-3] wrapper:
|
||||||
* [`mul_add`][f-ma-1-3], [`checked_mul_add`][f-cma-1-3],
|
* [`mul_add`][f-ma-1-3], [`checked_mul_add`][f-cma-1-3],
|
||||||
[`saturating_mul_add`][f-sma-1-3],
|
[`saturating_mul_add`][f-sma-1-3],
|
||||||
[`wrapping_mul_add`][f-wma-1-3],
|
[`wrapping_mul_add`][f-wma-1-3],
|
||||||
|
@ -96,6 +96,8 @@ The conversions supported cover the following cases.
|
||||||
[f-sma-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedI32.html#method.saturating_mul_add
|
[f-sma-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedI32.html#method.saturating_mul_add
|
||||||
[f-wma-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedI32.html#method.wrapping_mul_add
|
[f-wma-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedI32.html#method.wrapping_mul_add
|
||||||
[feat-un-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/#experimental-optional-features
|
[feat-un-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/#experimental-optional-features
|
||||||
|
[tf-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/traits/trait.Fixed.html
|
||||||
|
[w-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.Wrapping.html
|
||||||
|
|
||||||
### Version 1.2.0 news (2020-09-02)
|
### Version 1.2.0 news (2020-09-02)
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,8 @@ as-is, without any warranty. -->
|
||||||
Version 1.3.0 (unreleased)
|
Version 1.3.0 (unreleased)
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
* The following methods were added to all fixed-point types and to
|
* The following methods were added to all fixed-point types, to the
|
||||||
the `Fixed` trait:
|
[`Fixed`][tf-1-3] trait, and to the [`Wrapping`][w-1-3] wrapper:
|
||||||
* [`mul_add`][f-ma-1-3], [`checked_mul_add`][f-cma-1-3],
|
* [`mul_add`][f-ma-1-3], [`checked_mul_add`][f-cma-1-3],
|
||||||
[`saturating_mul_add`][f-sma-1-3],
|
[`saturating_mul_add`][f-sma-1-3],
|
||||||
[`wrapping_mul_add`][f-wma-1-3],
|
[`wrapping_mul_add`][f-wma-1-3],
|
||||||
|
@ -24,6 +24,8 @@ Version 1.3.0 (unreleased)
|
||||||
[f-sma-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedI32.html#method.saturating_mul_add
|
[f-sma-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedI32.html#method.saturating_mul_add
|
||||||
[f-wma-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedI32.html#method.wrapping_mul_add
|
[f-wma-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.FixedI32.html#method.wrapping_mul_add
|
||||||
[feat-un-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/#experimental-optional-features
|
[feat-un-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/#experimental-optional-features
|
||||||
|
[tf-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/traits/trait.Fixed.html
|
||||||
|
[w-1-3]: https://tspiteri.gitlab.io/fixed/dev/fixed/struct.Wrapping.html
|
||||||
|
|
||||||
Version 1.2.0 (2020-09-02)
|
Version 1.2.0 (2020-09-02)
|
||||||
==========================
|
==========================
|
||||||
|
|
|
@ -619,6 +619,35 @@ impl<F: Fixed> Unwrapped<F> {
|
||||||
Unwrapped(self.0.rotate_right(n))
|
Unwrapped(self.0.rotate_right(n))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Multiply and add. Returns `self` × `mul` + `add`.
|
||||||
|
///
|
||||||
|
/// # Panics
|
||||||
|
///
|
||||||
|
/// Panics if the result does not fit.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// use fixed::{types::I16F16, Unwrapped};
|
||||||
|
/// let half = Unwrapped(I16F16::from_num(0.5));
|
||||||
|
/// let three = Unwrapped(I16F16::from_num(3));
|
||||||
|
/// let four = Unwrapped(I16F16::from_num(4));
|
||||||
|
/// assert_eq!(three.mul_add(half, four), Unwrapped(I16F16::from_num(5.5)));
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// The following panics because of overflow.
|
||||||
|
///
|
||||||
|
/// ```should_panic
|
||||||
|
/// use fixed::{types::I16F16, Unwrapped};
|
||||||
|
/// let one = Unwrapped(I16F16::from_num(1));
|
||||||
|
/// let max = Unwrapped(I16F16::MAX);
|
||||||
|
/// let _overflow = max.mul_add(one, one);
|
||||||
|
/// ```
|
||||||
|
#[inline]
|
||||||
|
pub fn mul_add(self, mul: Unwrapped<F>, add: Unwrapped<F>) -> Unwrapped<F> {
|
||||||
|
Unwrapped(self.0.unwrapped_mul_add(mul.0, add.0))
|
||||||
|
}
|
||||||
|
|
||||||
/// Euclidean division.
|
/// Euclidean division.
|
||||||
///
|
///
|
||||||
/// # Panics
|
/// # Panics
|
||||||
|
@ -639,7 +668,7 @@ impl<F: Fixed> Unwrapped<F> {
|
||||||
/// ```should_panic
|
/// ```should_panic
|
||||||
/// use fixed::{types::I16F16, Unwrapped};
|
/// use fixed::{types::I16F16, Unwrapped};
|
||||||
/// let quarter = Unwrapped(I16F16::from_num(0.25));
|
/// let quarter = Unwrapped(I16F16::from_num(0.25));
|
||||||
/// let _overflow = Unwrapped::MAX.div_euclid(quarter);
|
/// let _overflow = Unwrapped(I16F16::MAX).div_euclid(quarter);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn div_euclid(self, divisor: Unwrapped<F>) -> Unwrapped<F> {
|
pub fn div_euclid(self, divisor: Unwrapped<F>) -> Unwrapped<F> {
|
||||||
|
|
|
@ -570,6 +570,24 @@ impl<F: Fixed> Wrapping<F> {
|
||||||
Wrapping(self.0.rotate_right(n))
|
Wrapping(self.0.rotate_right(n))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Multiply and add. Returns `self` × `mul` + `add`.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// use fixed::{types::I16F16, Wrapping};
|
||||||
|
/// let half = Wrapping(I16F16::from_num(0.5));
|
||||||
|
/// let three = Wrapping(I16F16::from_num(3));
|
||||||
|
/// let four = Wrapping(I16F16::from_num(4));
|
||||||
|
/// let max = Wrapping(I16F16::MAX);
|
||||||
|
/// assert_eq!(three.mul_add(half, four), Wrapping(I16F16::from_num(5.5)));
|
||||||
|
/// assert_eq!(max.mul_add(three, max), Wrapping(I16F16::from_bits(!0 << 2)));
|
||||||
|
/// ```
|
||||||
|
#[inline]
|
||||||
|
pub fn mul_add(self, mul: Wrapping<F>, add: Wrapping<F>) -> Wrapping<F> {
|
||||||
|
Wrapping(self.0.wrapping_mul_add(mul.0, add.0))
|
||||||
|
}
|
||||||
|
|
||||||
/// Euclidean division.
|
/// Euclidean division.
|
||||||
///
|
///
|
||||||
/// # Panics
|
/// # Panics
|
||||||
|
@ -584,8 +602,8 @@ impl<F: Fixed> Wrapping<F> {
|
||||||
/// let den = Wrapping(I16F16::from_num(2));
|
/// let den = Wrapping(I16F16::from_num(2));
|
||||||
/// assert_eq!(num.div_euclid(den), Wrapping(I16F16::from_num(3)));
|
/// assert_eq!(num.div_euclid(den), Wrapping(I16F16::from_num(3)));
|
||||||
/// let quarter = Wrapping(I16F16::from_num(0.25));
|
/// let quarter = Wrapping(I16F16::from_num(0.25));
|
||||||
/// let check = (Wrapping::MAX * 4i32).round_to_zero();
|
/// let check = (Wrapping(I16F16::MAX) * 4i32).round_to_zero();
|
||||||
/// assert_eq!(Wrapping::MAX.div_euclid(quarter), check);
|
/// assert_eq!(Wrapping(I16F16::MAX).div_euclid(quarter), check);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn div_euclid(self, divisor: Wrapping<F>) -> Wrapping<F> {
|
pub fn div_euclid(self, divisor: Wrapping<F>) -> Wrapping<F> {
|
||||||
|
|
Loading…
Reference in New Issue