Trait std::simd::StdFloat

source ·
pub trait StdFloat: Sealed + Sized {
    // Required method
    fn fract(self) -> Self;

    // Provided methods
    fn mul_add(self, a: Self, b: Self) -> Self { ... }
    fn sqrt(self) -> Self { ... }
    fn ceil(self) -> Self { ... }
    fn floor(self) -> Self { ... }
    fn round(self) -> Self { ... }
    fn trunc(self) -> Self { ... }
}
🔬This is a nightly-only experimental API. (portable_simd #86656)
Expand description

这个 trait 提供了 float 函数的可能临时实现,在没有硬件支持的情况下,该实现可以规范地调用操作系统的 math.h 动态加载库 (也称为共享对象)。

因为它们有条件地需要运行时支持,它们应该只出现在假设操作系统支持的二进制文件中: std

但是,SIMD 类型通常不需要操作系统支持,因为对于许多体系结构来说,嵌入式二进制文件可能只是简单地配置支持本身。 这意味着这些类型必须在 core 中可见,但这些函数在 std 中可用。

f32f64 使用 “lang items” 实现了类似的技巧,但是由于编译器的限制,对于像 Simd 这样的抽象数据类型很难实现这种方法。正是出于这种需要,这个 trait 诞生了。

将来,当编译器或其支持的运行时函数得到改进时,这个 trait 可能会以某种方式被取代。 目前,此 trait 可用于对可能缺乏硬件支持的 SIMD 浮点操作进行试验,例如 mul_add

Required Methods§

source

fn fract(self) -> Self

🔬This is a nightly-only experimental API. (portable_simd #86656)

返回浮点的小数值,删除其整数部分。

Provided Methods§

source

fn mul_add(self, a: Self, b: Self) -> Self

🔬This is a nightly-only experimental API. (portable_simd #86656)

融合乘法加法。 仅用一个舍入误差计算 (self * a) + b,比未融合的乘法加法产生更准确的结果。

如果目标体系结构具有专用的 fma CPU 指令,则使用 mul_add 的性能可能比未融合的乘加性能更高。 然而,这并不总是正确的,并且将在很大程度上依赖于设计具有特定目标硬件的算法。

source

fn sqrt(self) -> Self

🔬This is a nightly-only experimental API. (portable_simd #86656)

产生一个 vector,其中每个 lane 都具有 self 中等效索引 lane 的平方根值

source

fn ceil(self) -> Self

🔬This is a nightly-only experimental API. (portable_simd #86656)

返回大于或等于每个 lane 的最小整数。

source

fn floor(self) -> Self

🔬This is a nightly-only experimental API. (portable_simd #86656)

返回小于或等于每个 lane 的最大整数值。

source

fn round(self) -> Self

🔬This is a nightly-only experimental API. (portable_simd #86656)

舍入到最接近的整数值。接近于零。

source

fn trunc(self) -> Self

🔬This is a nightly-only experimental API. (portable_simd #86656)

返回浮点的整数值,去掉小数部分。

Implementors§

source§

impl<const N: usize> StdFloat for Simd<f32, N>where LaneCount<N>: SupportedLaneCount,

source§

impl<const N: usize> StdFloat for Simd<f64, N>where LaneCount<N>: SupportedLaneCount,