SimdFloat in std::simd::num - Rust (original) (raw)
pub trait SimdFloat: Copy + Sealed {
type Mask;
type Scalar;
type Bits;
type Cast<T: SimdElement>;
Show 24 methods // Required methods
fn cast<T>(self) -> Self::Cast<T>
where T: SimdCast;
unsafe fn to_int_unchecked<I>(self) -> Self::Cast<I>
where I: SimdCast,
Self::Scalar: FloatToInt<I>;
fn to_bits(self) -> Self::Bits;
fn from_bits(bits: Self::Bits) -> Self;
fn abs(self) -> Self;
fn recip(self) -> Self;
fn to_degrees(self) -> Self;
fn to_radians(self) -> Self;
fn is_sign_positive(self) -> Self::Mask;
fn is_sign_negative(self) -> Self::Mask;
fn is_nan(self) -> Self::Mask;
fn is_infinite(self) -> Self::Mask;
fn is_finite(self) -> Self::Mask;
fn is_subnormal(self) -> Self::Mask;
fn is_normal(self) -> Self::Mask;
fn signum(self) -> Self;
fn copysign(self, sign: Self) -> Self;
fn simd_min(self, other: Self) -> Self;
fn simd_max(self, other: Self) -> Self;
fn simd_clamp(self, min: Self, max: Self) -> Self;
fn reduce_sum(self) -> Self::Scalar;
fn reduce_product(self) -> Self::Scalar;
fn reduce_max(self) -> Self::Scalar;
fn reduce_min(self) -> Self::Scalar;
}
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Expand description
Operations on SIMD vectors of floats.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Mask type used for manipulating this SIMD vector type.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Scalar type contained by this SIMD vector type.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Bit representation of this SIMD vector type.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
A SIMD vector with a different element type.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Performs elementwise conversion of this vector’s elements to another SIMD-valid type.
This follows the semantics of Rust’s as
conversion for floats (truncating or saturating at the limits) for each element.
§Example
let floats: Simd<f32, 4> = Simd::from_array([1.9, -4.5, f32::INFINITY, f32::NAN]);
let ints = floats.cast::<i32>();
assert_eq!(ints, Simd::from_array([1, -4, i32::MAX, 0]));
// Formally equivalent, but `Simd::cast` can optimize better.
assert_eq!(ints, Simd::from_array(floats.to_array().map(|x| x as i32)));
// The float conversion does not round-trip.
let floats_again = ints.cast();
assert_ne!(floats, floats_again);
assert_eq!(floats_again, Simd::from_array([1.0, -4.0, 2147483647.0, 0.0]));
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Rounds toward zero and converts to the same-width integer type, assuming that the value is finite and fits in that type.
§Safety
The value must:
- Not be NaN
- Not be infinite
- Be representable in the return type, after truncating off its fractional part
If these requirements are infeasible or costly, consider using the safe function cast, which saturates on conversion.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Raw transmutation to an unsigned integer vector type with the same size and number of elements.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Raw transmutation from an unsigned integer vector type with the same size and number of elements.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Produces a vector where every element has the absolute value of the equivalently-indexed element in self
.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Takes the reciprocal (inverse) of each element, 1/x
.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Converts each element from radians to degrees.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Converts each element from degrees to radians.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns true for each element if it has a positive sign, including+0.0
, NaN
s with positive sign bit and positive infinity.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns true for each element if it has a negative sign, including-0.0
, NaN
s with negative sign bit and negative infinity.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns true for each element if its value is NaN
.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns true for each element if its value is positive infinity or negative infinity.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns true for each element if its value is neither infinite nor NaN
.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns true for each element if its value is subnormal.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns true for each element if its value is neither zero, infinite, subnormal, nor NaN
.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Replaces each element with a number that represents its sign.
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
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns each element with the magnitude of self
and the sign of sign
.
For any element containing a NAN
, a NAN
with the sign of sign
is returned.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns the minimum of each element.
If one of the values is NAN
, then the other value is returned.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns the maximum of each element.
If one of the values is NAN
, then the other value is returned.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Restrict each element to a certain interval unless it is NaN.
For each element in self
, returns the corresponding element in max
if the element is greater than max
, and the corresponding element in min
if the element is less than min
. Otherwise returns the element in self
.
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns the sum of the elements of the vector.
§Examples
let v = f32x2::from_array([1., 2.]);
assert_eq!(v.reduce_sum(), 3.);
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Reducing multiply. Returns the product of the elements of the vector.
§Examples
let v = f32x2::from_array([3., 4.]);
assert_eq!(v.reduce_product(), 12.);
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns the maximum element in the vector.
Returns values based on equality, so a vector containing both 0.
and -0.
may return either.
This function will not return NaN
unless all elements are NaN
.
§Examples
let v = f32x2::from_array([1., 2.]);
assert_eq!(v.reduce_max(), 2.);
// NaN values are skipped...
let v = f32x2::from_array([1., f32::NAN]);
assert_eq!(v.reduce_max(), 1.);
// ...unless all values are NaN
let v = f32x2::from_array([f32::NAN, f32::NAN]);
assert!(v.reduce_max().is_nan());
🔬This is a nightly-only experimental API. (portable_simd
#86656)
Returns the minimum element in the vector.
Returns values based on equality, so a vector containing both 0.
and -0.
may return either.
This function will not return NaN
unless all elements are NaN
.
§Examples
let v = f32x2::from_array([3., 7.]);
assert_eq!(v.reduce_min(), 3.);
// NaN values are skipped...
let v = f32x2::from_array([1., f32::NAN]);
assert_eq!(v.reduce_min(), 1.);
// ...unless all values are NaN
let v = f32x2::from_array([f32::NAN, f32::NAN]);
assert!(v.reduce_min().is_nan());
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.