a49013e338
59: Added `MulAdd` and `MulAddAssign` traits r=cuviper a=regexident Both `f32` and `f64` implement fused multiply-add, which computes `(self * a) + b` with only one rounding error. This produces a more accurate result with better performance than a separate multiplication operation followed by an add: ```rust fn mul_add(self, a: f32, b: f32) -> f32[src] ``` It is however not possible to make use of this in a generic context by abstracting over a trait. My concrete use-case is machine learning, [gradient descent](https://en.wikipedia.org/wiki/Gradient_descent) to be specific, where the core operation of updating the gradient could make use of `mul_add` for both its `weights: Vector` as well as its `bias: f32`: ```rust struct Perceptron { weights: Vector, bias: f32, } impl MulAdd<f32, Self> for Vector { // ... } impl Perceptron { fn learn(&mut self, example: Vector, expected: f32, learning_rate: f32) { let alpha = self.error(example, expected, learning_rate); self.weights = example.mul_add(alpha, self.weights); self.bias = self.bias.mul_add(alpha, self.bias) } } ``` (The actual impl of `Vector` would be generic over its value type: `Vector<T>`, thus requiring the trait.) Co-authored-by: Vincent Esche <regexident@gmail.com> Co-authored-by: Josh Stone <cuviper@gmail.com> |
||
---|---|---|
ci | ||
src | ||
.gitignore | ||
.travis.yml | ||
Cargo.toml | ||
LICENSE-APACHE | ||
LICENSE-MIT | ||
README.md | ||
RELEASES.md | ||
bors.toml |
README.md
num-traits
Numeric traits for generic mathematics in Rust.
Usage
Add this to your Cargo.toml
:
[dependencies]
num-traits = "0.2"
and this to your crate root:
extern crate num_traits;
Features
This crate can be used without the standard library (#![no_std]
) by disabling
the default std
feature. Use this in Cargo.toml
:
[dependencies.num-traits]
version = "0.2"
default-features = false
The Float
and Real
traits are only available when std
is enabled. The
FloatCore
trait is always available.
Releases
Release notes are available in RELEASES.md.
Compatibility
The num-traits
crate is tested for rustc 1.8 and greater.