pub trait SimdFloat: Copy + Sealed {
type Mask;
type Scalar;
type Bits;
Show 22 methods
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;
}
Expand description
Operations on SIMD vectors of floats.
Required Associated Types
Mask type used for manipulating this SIMD vector type.
Scalar type contained by this SIMD vector type.
Required Methods
Raw transmutation to an unsigned integer vector type with the same size and number of lanes.
Raw transmutation from an unsigned integer vector type with the same size and number of lanes.
Produces a vector where every lane has the absolute value of the
equivalently-indexed lane in self
.
Takes the reciprocal (inverse) of each lane, 1/x
.
fn is_sign_positive(self) -> Self::Mask
fn is_sign_positive(self) -> Self::Mask
Returns true for each lane if it has a positive sign, including
+0.0
, NaN
s with positive sign bit and positive infinity.
fn is_sign_negative(self) -> Self::Mask
fn is_sign_negative(self) -> Self::Mask
Returns true for each lane if it has a negative sign, including
-0.0
, NaN
s with negative sign bit and negative infinity.
Returns true for each lane if its value is NaN
.
fn is_infinite(self) -> Self::Mask
fn is_infinite(self) -> Self::Mask
Returns true for each lane if its value is positive infinity or negative infinity.
Returns true for each lane if its value is neither infinite nor NaN
.
Returns true for each lane if its value is neither zero, infinite,
subnormal, nor NaN
.
Replaces each lane 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
Returns each lane with the magnitude of self
and the sign of sign
.
For any lane containing a NAN
, a NAN
with the sign of sign
is returned.
Returns the minimum of each lane.
If one of the values is NAN
, then the other value is returned.
Returns the maximum of each lane.
If one of the values is NAN
, then the other value is returned.
fn simd_clamp(self, min: Self, max: Self) -> Self
fn simd_clamp(self, min: Self, max: Self) -> Self
Restrict each lane to a certain interval unless it is NaN.
For each lane in self
, returns the corresponding lane in max
if the lane is
greater than max
, and the corresponding lane in min
if the lane is less
than min
. Otherwise returns the lane in self
.
fn reduce_sum(self) -> Self::Scalar
fn reduce_sum(self) -> Self::Scalar
fn reduce_product(self) -> Self::Scalar
fn reduce_product(self) -> Self::Scalar
fn reduce_max(self) -> Self::Scalar
fn reduce_max(self) -> Self::Scalar
Returns the maximum lane 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 lanes 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());
Runfn reduce_min(self) -> Self::Scalar
fn reduce_min(self) -> Self::Scalar
Returns the minimum lane 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 lanes 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());
Run