pub trait Float: Sized {
Show 39 methods
// Required methods
fn floor(self) -> Self;
fn ceil(self) -> Self;
fn round(self) -> Self;
fn trunc(self) -> Self;
fn fract(self) -> Self;
fn abs(self) -> Self;
fn signum(self) -> Self;
fn copysign(self, y: Self) -> Self;
fn mul_add(self, a: Self, b: Self) -> Self;
fn div_euc(self, rhs: Self) -> Self;
fn mod_euc(self, rhs: Self) -> Self;
fn powi(self, n: i32) -> Self;
fn powf(self, n: Self) -> Self;
fn sqrt(self) -> Self;
fn exp(self) -> Self;
fn exp2(self) -> Self;
fn ln(self) -> Self;
fn log(self, base: Self) -> Self;
fn log2(self) -> Self;
fn log10(self) -> Self;
fn abs_sub(self, other: Self) -> Self;
fn cbrt(self) -> Self;
fn hypot(self, other: Self) -> Self;
fn sin(self) -> Self;
fn cos(self) -> Self;
fn tan(self) -> Self;
fn asin(self) -> Self;
fn acos(self) -> Self;
fn atan(self) -> Self;
fn atan2(self, other: Self) -> Self;
fn sin_cos(self) -> (Self, Self)
where Self: Sized;
fn exp_m1(self) -> Self;
fn ln_1p(self) -> Self;
fn sinh(self) -> Self;
fn cosh(self) -> Self;
fn tanh(self) -> Self;
fn asinh(self) -> Self;
fn acosh(self) -> Self;
fn atanh(self) -> Self;
}
Expand description
Copy and pasted from Rust std
Required Methods§
Sourcefn floor(self) -> Self
fn floor(self) -> Self
Returns the largest integer less than or equal to a number.
§Examples
let f = 3.99_f64;
let g = 3.0_f64;
assert_eq!(f.floor(), 3.0);
assert_eq!(g.floor(), 3.0);
Sourcefn ceil(self) -> Self
fn ceil(self) -> Self
Returns the smallest integer greater than or equal to a number.
§Examples
let f = 3.01_f64;
let g = 4.0_f64;
assert_eq!(f.ceil(), 4.0);
assert_eq!(g.ceil(), 4.0);
Sourcefn round(self) -> Self
fn round(self) -> Self
Returns the nearest integer to a number. Round half-way cases away from
0.0
.
§Examples
let f = 3.3_f64;
let g = -3.3_f64;
assert_eq!(f.round(), 3.0);
assert_eq!(g.round(), -3.0);
Sourcefn trunc(self) -> Self
fn trunc(self) -> Self
Returns the integer part of a number.
§Examples
let f = 3.3_f64;
let g = -3.7_f64;
assert_eq!(f.trunc(), 3.0);
assert_eq!(g.trunc(), -3.0);
Sourcefn fract(self) -> Self
fn fract(self) -> Self
Returns the fractional part of a number.
§Examples
let x = 3.5_f64;
let y = -3.5_f64;
let abs_difference_x = (x.fract() - 0.5).abs();
let abs_difference_y = (y.fract() - (-0.5)).abs();
assert!(abs_difference_x < 1e-10);
assert!(abs_difference_y < 1e-10);
Sourcefn abs(self) -> Self
fn abs(self) -> Self
Computes the absolute value of self
. Returns NAN
if the
number is NAN
.
§Examples
use std::f64;
let x = 3.5_f64;
let y = -3.5_f64;
let abs_difference_x = (x.abs() - x).abs();
let abs_difference_y = (y.abs() - (-y)).abs();
assert!(abs_difference_x < 1e-10);
assert!(abs_difference_y < 1e-10);
assert!(f64::NAN.abs().is_nan());
Sourcefn signum(self) -> Self
fn signum(self) -> Self
Returns a number that represents the sign of self
.
1.0
if the number is positive,+0.0
orINFINITY
-1.0
if the number is negative,-0.0
orNEG_INFINITY
NAN
if the number isNAN
§Examples
use std::f64;
let f = 3.5_f64;
assert_eq!(f.signum(), 1.0);
assert_eq!(f64::NEG_INFINITY.signum(), -1.0);
assert!(f64::NAN.signum().is_nan());
Sourcefn copysign(self, y: Self) -> Self
fn copysign(self, y: Self) -> Self
Returns a number composed of the magnitude of self
and the sign of
y
.
Equal to self
if the sign of self
and y
are the same, otherwise
equal to -self
. If self
is a NAN
, then a NAN
with the sign of
y
is returned.
§Examples
#![feature(copysign)]
use std::f64;
let f = 3.5_f64;
assert_eq!(f.copysign(0.42), 3.5_f64);
assert_eq!(f.copysign(-0.42), -3.5_f64);
assert_eq!((-f).copysign(0.42), 3.5_f64);
assert_eq!((-f).copysign(-0.42), -3.5_f64);
assert!(f64::NAN.copysign(1.0).is_nan());
Sourcefn mul_add(self, a: Self, b: Self) -> Self
fn mul_add(self, a: Self, b: Self) -> Self
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.
§Examples
let m = 10.0_f64;
let x = 4.0_f64;
let b = 60.0_f64;
// 100.0
let abs_difference = (m.mul_add(x, b) - (m*x + b)).abs();
assert!(abs_difference < 1e-10);
Sourcefn div_euc(self, rhs: Self) -> Self
fn div_euc(self, rhs: Self) -> Self
Calculates Euclidean division, the matching method for mod_euc
.
This computes the integer n
such that
self = n * rhs + self.mod_euc(rhs)
.
In other words, the result is self / rhs
rounded to the integer n
such that self >= n * rhs
.
§Examples
#![feature(euclidean_division)]
let a: f64 = 7.0;
let b = 4.0;
assert_eq!(a.div_euc(b), 1.0); // 7.0 > 4.0 * 1.0
assert_eq!((-a).div_euc(b), -2.0); // -7.0 >= 4.0 * -2.0
assert_eq!(a.div_euc(-b), -1.0); // 7.0 >= -4.0 * -1.0
assert_eq!((-a).div_euc(-b), 2.0); // -7.0 >= -4.0 * 2.0
Sourcefn mod_euc(self, rhs: Self) -> Self
fn mod_euc(self, rhs: Self) -> Self
Calculates the Euclidean modulo (self mod rhs), which is never negative.
In particular, the return value r
satisfies 0.0 <= r < rhs.abs()
in
most cases. However, due to a floating point round-off error it can
result in r == rhs.abs()
, violating the mathematical definition, if
self
is much smaller than rhs.abs()
in magnitude and self < 0.0
.
This result is not an element of the function’s codomain, but it is the
closest floating point number in the real numbers and thus fulfills the
property self == self.div_euc(rhs) * rhs + self.mod_euc(rhs)
approximatively.
§Examples
#![feature(euclidean_division)]
let a: f64 = 7.0;
let b = 4.0;
assert_eq!(a.mod_euc(b), 3.0);
assert_eq!((-a).mod_euc(b), 1.0);
assert_eq!(a.mod_euc(-b), 3.0);
assert_eq!((-a).mod_euc(-b), 1.0);
// limitation due to round-off error
assert_ne!((-std::f64::EPSILON).mod_euc(3.0), 0.0);
Sourcefn powi(self, n: i32) -> Self
fn powi(self, n: i32) -> Self
Raises a number to an integer power.
Using this function is generally faster than using powf
§Examples
let x = 2.0_f64;
let abs_difference = (x.powi(2) - x*x).abs();
assert!(abs_difference < 1e-10);
Sourcefn powf(self, n: Self) -> Self
fn powf(self, n: Self) -> Self
Raises a number to a floating point power.
§Examples
let x = 2.0_f64;
let abs_difference = (x.powf(2.0) - x*x).abs();
assert!(abs_difference < 1e-10);
Sourcefn sqrt(self) -> Self
fn sqrt(self) -> Self
Takes the square root of a number.
Returns NaN if self
is a negative number.
§Examples
let positive = 4.0_f64;
let negative = -4.0_f64;
let abs_difference = (positive.sqrt() - 2.0).abs();
assert!(abs_difference < 1e-10);
assert!(negative.sqrt().is_nan());
Sourcefn exp(self) -> Self
fn exp(self) -> Self
Returns e^(self)
, (the exponential function).
§Examples
let one = 1.0_f64;
// e^1
let e = one.exp();
// ln(e) - 1 == 0
let abs_difference = (e.ln() - 1.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn exp2(self) -> Self
fn exp2(self) -> Self
Returns 2^(self)
.
§Examples
let f = 2.0_f64;
// 2^2 - 4 == 0
let abs_difference = (f.exp2() - 4.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn ln(self) -> Self
fn ln(self) -> Self
Returns the natural logarithm of the number.
§Examples
let one = 1.0_f64;
// e^1
let e = one.exp();
// ln(e) - 1 == 0
let abs_difference = (e.ln() - 1.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn log(self, base: Self) -> Self
fn log(self, base: Self) -> Self
Returns the logarithm of the number with respect to an arbitrary base.
The result may not be correctly rounded owing to implementation details;
self.log2()
can produce more accurate results for base 2, and
self.log10()
can produce more accurate results for base 10.
§Examples
let five = 5.0_f64;
// log5(5) - 1 == 0
let abs_difference = (five.log(5.0) - 1.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn log2(self) -> Self
fn log2(self) -> Self
Returns the base 2 logarithm of the number.
§Examples
let two = 2.0_f64;
// log2(2) - 1 == 0
let abs_difference = (two.log2() - 1.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn log10(self) -> Self
fn log10(self) -> Self
Returns the base 10 logarithm of the number.
§Examples
let ten = 10.0_f64;
// log10(10) - 1 == 0
let abs_difference = (ten.log10() - 1.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn abs_sub(self, other: Self) -> Self
👎Deprecated: you probably meant (self - other).abs()
: this operation is (self - other).max(0.0)
(also known as fdim
in C). If you truly need the positive difference, consider using that expression or the C function fdim
, depending on how you wish to handle NaN (please consider filing an issue describing your use-case too).
fn abs_sub(self, other: Self) -> Self
(self - other).abs()
: this operation is (self - other).max(0.0)
(also known as fdim
in C). If you truly need the positive difference, consider using that expression or the C function fdim
, depending on how you wish to handle NaN (please consider filing an issue describing your use-case too).The positive difference of two numbers.
- If
self <= other
:0:0
- Else:
self - other
§Examples
let x = 3.0_f64;
let y = -3.0_f64;
let abs_difference_x = (x.abs_sub(1.0) - 2.0).abs();
let abs_difference_y = (y.abs_sub(1.0) - 0.0).abs();
assert!(abs_difference_x < 1e-10);
assert!(abs_difference_y < 1e-10);
Sourcefn cbrt(self) -> Self
fn cbrt(self) -> Self
Takes the cubic root of a number.
§Examples
let x = 8.0_f64;
// x^(1/3) - 2 == 0
let abs_difference = (x.cbrt() - 2.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn hypot(self, other: Self) -> Self
fn hypot(self, other: Self) -> Self
Calculates the length of the hypotenuse of a right-angle triangle given
legs of length x
and y
.
§Examples
let x = 2.0_f64;
let y = 3.0_f64;
// sqrt(x^2 + y^2)
let abs_difference = (x.hypot(y) - (x.powi(2) + y.powi(2)).sqrt()).abs();
assert!(abs_difference < 1e-10);
Sourcefn sin(self) -> Self
fn sin(self) -> Self
Computes the sine of a number (in radians).
§Examples
use std::f64;
let x = f64::consts::PI/2.0;
let abs_difference = (x.sin() - 1.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn cos(self) -> Self
fn cos(self) -> Self
Computes the cosine of a number (in radians).
§Examples
use std::f64;
let x = 2.0*f64::consts::PI;
let abs_difference = (x.cos() - 1.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn tan(self) -> Self
fn tan(self) -> Self
Computes the tangent of a number (in radians).
§Examples
use std::f64;
let x = f64::consts::PI/4.0;
let abs_difference = (x.tan() - 1.0).abs();
assert!(abs_difference < 1e-14);
Sourcefn asin(self) -> Self
fn asin(self) -> Self
Computes the arcsine of a number. Return value is in radians in the range [-pi/2, pi/2] or NaN if the number is outside the range [-1, 1].
§Examples
use std::f64;
let f = f64::consts::PI / 2.0;
// asin(sin(pi/2))
let abs_difference = (f.sin().asin() - f64::consts::PI / 2.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn acos(self) -> Self
fn acos(self) -> Self
Computes the arccosine of a number. Return value is in radians in the range [0, pi] or NaN if the number is outside the range [-1, 1].
§Examples
use std::f64;
let f = f64::consts::PI / 4.0;
// acos(cos(pi/4))
let abs_difference = (f.cos().acos() - f64::consts::PI / 4.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn atan(self) -> Self
fn atan(self) -> Self
Computes the arctangent of a number. Return value is in radians in the range [-pi/2, pi/2];
§Examples
let f = 1.0_f64;
// atan(tan(1))
let abs_difference = (f.tan().atan() - 1.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn atan2(self, other: Self) -> Self
fn atan2(self, other: Self) -> Self
Computes the four quadrant arctangent of self
(y
) and other
(x
) in radians.
x = 0
,y = 0
:0
x >= 0
:arctan(y/x)
->[-pi/2, pi/2]
y >= 0
:arctan(y/x) + pi
->(pi/2, pi]
y < 0
:arctan(y/x) - pi
->(-pi, -pi/2)
§Examples
use std::f64;
let pi = f64::consts::PI;
// Positive angles measured counter-clockwise
// from positive x axis
// -pi/4 radians (45 deg clockwise)
let x1 = 3.0_f64;
let y1 = -3.0_f64;
// 3pi/4 radians (135 deg counter-clockwise)
let x2 = -3.0_f64;
let y2 = 3.0_f64;
let abs_difference_1 = (y1.atan2(x1) - (-pi/4.0)).abs();
let abs_difference_2 = (y2.atan2(x2) - 3.0*pi/4.0).abs();
assert!(abs_difference_1 < 1e-10);
assert!(abs_difference_2 < 1e-10);
Sourcefn sin_cos(self) -> (Self, Self)where
Self: Sized,
fn sin_cos(self) -> (Self, Self)where
Self: Sized,
Simultaneously computes the sine and cosine of the number, x
. Returns
(sin(x), cos(x))
.
§Examples
use std::f64;
let x = f64::consts::PI/4.0;
let f = x.sin_cos();
let abs_difference_0 = (f.0 - x.sin()).abs();
let abs_difference_1 = (f.1 - x.cos()).abs();
assert!(abs_difference_0 < 1e-10);
assert!(abs_difference_1 < 1e-10);
Sourcefn exp_m1(self) -> Self
fn exp_m1(self) -> Self
Returns e^(self) - 1
in a way that is accurate even if the
number is close to zero.
§Examples
let x = 7.0_f64;
// e^(ln(7)) - 1
let abs_difference = (x.ln().exp_m1() - 6.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn ln_1p(self) -> Self
fn ln_1p(self) -> Self
Returns ln(1+n)
(natural logarithm) more accurately than if
the operations were performed separately.
§Examples
use std::f64;
let x = f64::consts::E - 1.0;
// ln(1 + (e - 1)) == ln(e) == 1
let abs_difference = (x.ln_1p() - 1.0).abs();
assert!(abs_difference < 1e-10);
Sourcefn sinh(self) -> Self
fn sinh(self) -> Self
Hyperbolic sine function.
§Examples
use std::f64;
let e = f64::consts::E;
let x = 1.0_f64;
let f = x.sinh();
// Solving sinh() at 1 gives `(e^2-1)/(2e)`
let g = (e*e - 1.0)/(2.0*e);
let abs_difference = (f - g).abs();
assert!(abs_difference < 1e-10);
Sourcefn cosh(self) -> Self
fn cosh(self) -> Self
Hyperbolic cosine function.
§Examples
use std::f64;
let e = f64::consts::E;
let x = 1.0_f64;
let f = x.cosh();
// Solving cosh() at 1 gives this result
let g = (e*e + 1.0)/(2.0*e);
let abs_difference = (f - g).abs();
// Same result
assert!(abs_difference < 1.0e-10);
Sourcefn tanh(self) -> Self
fn tanh(self) -> Self
Hyperbolic tangent function.
§Examples
use std::f64;
let e = f64::consts::E;
let x = 1.0_f64;
let f = x.tanh();
// Solving tanh() at 1 gives `(1 - e^(-2))/(1 + e^(-2))`
let g = (1.0 - e.powi(-2))/(1.0 + e.powi(-2));
let abs_difference = (f - g).abs();
assert!(abs_difference < 1.0e-10);
Sourcefn asinh(self) -> Self
fn asinh(self) -> Self
Inverse hyperbolic sine function.
§Examples
let x = 1.0_f64;
let f = x.sinh().asinh();
let abs_difference = (f - x).abs();
assert!(abs_difference < 1.0e-10);
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.
Implementations on Foreign Types§
Source§impl Float for f32
impl Float for f32
fn floor(self) -> f32
fn ceil(self) -> f32
fn round(self) -> f32
fn trunc(self) -> f32
fn fract(self) -> f32
fn abs(self) -> f32
fn signum(self) -> f32
fn copysign(self, y: f32) -> f32
fn mul_add(self, a: f32, b: f32) -> f32
fn div_euc(self, rhs: f32) -> f32
fn mod_euc(self, rhs: f32) -> f32
fn powi(self, n: i32) -> f32
fn powf(self, n: f32) -> f32
fn sqrt(self) -> f32
fn exp(self) -> f32
fn exp2(self) -> f32
fn ln(self) -> f32
fn log(self, base: f32) -> f32
fn log2(self) -> f32
fn log10(self) -> f32
Source§fn abs_sub(self, other: f32) -> f32
fn abs_sub(self, other: f32) -> f32
(self - other).abs()
: this operation is (self - other).max(0.0)
(also known as fdim
in C). If you truly need the positive difference, consider using that expression or the C function fdim
, depending on how you wish to handle NaN (please consider filing an issue describing your use-case too).fn cbrt(self) -> f32
fn hypot(self, other: f32) -> f32
fn sin(self) -> f32
fn cos(self) -> f32
fn tan(self) -> f32
fn asin(self) -> f32
fn acos(self) -> f32
fn atan(self) -> f32
fn atan2(self, other: f32) -> f32
fn sin_cos(self) -> (f32, f32)
fn exp_m1(self) -> f32
fn ln_1p(self) -> f32
fn sinh(self) -> f32
fn cosh(self) -> f32
fn tanh(self) -> f32
fn asinh(self) -> f32
fn acosh(self) -> f32
fn atanh(self) -> f32
Source§impl Float for f64
impl Float for f64
fn floor(self) -> f64
fn ceil(self) -> f64
fn round(self) -> f64
fn trunc(self) -> f64
fn fract(self) -> f64
fn abs(self) -> f64
fn signum(self) -> f64
fn copysign(self, y: f64) -> f64
fn mul_add(self, a: f64, b: f64) -> f64
fn div_euc(self, rhs: f64) -> f64
fn mod_euc(self, rhs: f64) -> f64
fn powi(self, n: i32) -> f64
fn powf(self, n: f64) -> f64
fn sqrt(self) -> f64
fn exp(self) -> f64
fn exp2(self) -> f64
fn ln(self) -> f64
fn log(self, base: f64) -> f64
fn log2(self) -> f64
fn log10(self) -> f64
Source§fn abs_sub(self, other: f64) -> f64
fn abs_sub(self, other: f64) -> f64
(self - other).abs()
: this operation is (self - other).max(0.0)
(also known as fdim
in C). If you truly need the positive difference, consider using that expression or the C function fdim
, depending on how you wish to handle NaN (please consider filing an issue describing your use-case too).