pub trait MulAdd<A = Self, B = Self> {
type Output;
fn mul_add(self, a: A, b: B) -> Self::Output;
}
Fused multiply-add. Computes (self * a) + b
with only one rounding
error, yielding a more accurate result than an unfused multiply-add.
Using mul_add
can be more performant than an unfused multiply-add if
the target architecture has a dedicated fma
CPU instruction.
Note that A
and B
are Self
by default, but this is not mandatory.
use std::f32;
let m = 10.0_f32;
let x = 4.0_f32;
let b = 60.0_f32;
let abs_difference = (m.mul_add(x, b) - (m*x + b)).abs();
assert!(abs_difference <= f32::EPSILON);
The resulting type after applying the fused multiply-add.
fn mul_add(self, a: A, b: B) -> Self::Output
Performs the fused multiply-add operation.
impl MulAdd<i128, i128> for i128 | [src] |
impl MulAdd<i16, i16> for i16 | [src] |
impl MulAdd<i32, i32> for i32 | [src] |
impl MulAdd<i64, i64> for i64 | [src] |
impl MulAdd<i8, i8> for i8 | [src] |
impl MulAdd<isize, isize> for isize | [src] |
impl MulAdd<u128, u128> for u128 | [src] |
impl MulAdd<u16, u16> for u16 | [src] |
impl MulAdd<u32, u32> for u32 | [src] |
impl MulAdd<u64, u64> for u64 | [src] |
impl MulAdd<u8, u8> for u8 | [src] |
impl MulAdd<usize, usize> for usize | [src] |