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;
}
portable_simd
#86656)Expand description
Operations on SIMD vectors of floats.
Required Associated Types§
sourcetype Mask
type Mask
portable_simd
#86656)Mask type used for manipulating this SIMD vector type.
sourcetype Scalar
type Scalar
portable_simd
#86656)Scalar type contained by this SIMD vector type.
sourcetype Bits
type Bits
portable_simd
#86656)Bit representation of this SIMD vector type.
sourcetype Cast<T: SimdElement>
type Cast<T: SimdElement>
portable_simd
#86656)A SIMD vector with a different element type.
Required Methods§
sourcefn cast<T>(self) -> Self::Cast<T>where
T: SimdCast,
fn cast<T>(self) -> Self::Cast<T>where T: SimdCast,
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]));
Runsourceunsafe fn to_int_unchecked<I>(self) -> Self::Cast<I>where
I: SimdCast,
Self::Scalar: FloatToInt<I>,
unsafe fn to_int_unchecked<I>(self) -> Self::Cast<I>where I: SimdCast, Self::Scalar: FloatToInt<I>,
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.
sourcefn to_bits(self) -> Self::Bits
fn to_bits(self) -> Self::Bits
portable_simd
#86656)Raw transmutation to an unsigned integer vector type with the same size and number of lanes.
sourcefn from_bits(bits: Self::Bits) -> Self
fn from_bits(bits: Self::Bits) -> Self
portable_simd
#86656)Raw transmutation from an unsigned integer vector type with the same size and number of lanes.
sourcefn abs(self) -> Self
fn abs(self) -> Self
portable_simd
#86656)Produces a vector where every lane has the absolute value of the
equivalently-indexed lane in self
.
sourcefn recip(self) -> Self
fn recip(self) -> Self
portable_simd
#86656)Takes the reciprocal (inverse) of each lane, 1/x
.
sourcefn to_degrees(self) -> Self
fn to_degrees(self) -> Self
portable_simd
#86656)Converts each lane from radians to degrees.
sourcefn to_radians(self) -> Self
fn to_radians(self) -> Self
portable_simd
#86656)Converts each lane from degrees to radians.
sourcefn is_sign_positive(self) -> Self::Mask
fn is_sign_positive(self) -> Self::Mask
portable_simd
#86656)Returns true for each lane if it has a positive sign, including
+0.0
, NaN
s with positive sign bit and positive infinity.
sourcefn is_sign_negative(self) -> Self::Mask
fn is_sign_negative(self) -> Self::Mask
portable_simd
#86656)Returns true for each lane if it has a negative sign, including
-0.0
, NaN
s with negative sign bit and negative infinity.
sourcefn is_nan(self) -> Self::Mask
fn is_nan(self) -> Self::Mask
portable_simd
#86656)Returns true for each lane if its value is NaN
.
sourcefn is_infinite(self) -> Self::Mask
fn is_infinite(self) -> Self::Mask
portable_simd
#86656)Returns true for each lane if its value is positive infinity or negative infinity.
sourcefn is_finite(self) -> Self::Mask
fn is_finite(self) -> Self::Mask
portable_simd
#86656)Returns true for each lane if its value is neither infinite nor NaN
.
sourcefn is_subnormal(self) -> Self::Mask
fn is_subnormal(self) -> Self::Mask
portable_simd
#86656)Returns true for each lane if its value is subnormal.
sourcefn is_normal(self) -> Self::Mask
fn is_normal(self) -> Self::Mask
portable_simd
#86656)Returns true for each lane if its value is neither zero, infinite,
subnormal, nor NaN
.
sourcefn signum(self) -> Self
fn signum(self) -> Self
portable_simd
#86656)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
sourcefn copysign(self, sign: Self) -> Self
fn copysign(self, sign: Self) -> Self
portable_simd
#86656)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.
sourcefn simd_min(self, other: Self) -> Self
fn simd_min(self, other: Self) -> Self
portable_simd
#86656)Returns the minimum of each lane.
If one of the values is NAN
, then the other value is returned.
sourcefn simd_max(self, other: Self) -> Self
fn simd_max(self, other: Self) -> Self
portable_simd
#86656)Returns the maximum of each lane.
If one of the values is NAN
, then the other value is returned.
sourcefn simd_clamp(self, min: Self, max: Self) -> Self
fn simd_clamp(self, min: Self, max: Self) -> Self
portable_simd
#86656)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
.
sourcefn reduce_sum(self) -> Self::Scalar
fn reduce_sum(self) -> Self::Scalar
portable_simd
#86656)sourcefn reduce_product(self) -> Self::Scalar
fn reduce_product(self) -> Self::Scalar
portable_simd
#86656)sourcefn reduce_max(self) -> Self::Scalar
fn reduce_max(self) -> Self::Scalar
portable_simd
#86656)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());
Runsourcefn reduce_min(self) -> Self::Scalar
fn reduce_min(self) -> Self::Scalar
portable_simd
#86656)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