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
中可用。
f32
和 f64
使用 “lang items” 实现了类似的技巧,但是由于编译器的限制,对于像 Simd
这样的抽象数据类型很难实现这种方法。正是出于这种需要,这个 trait 诞生了。
将来,当编译器或其支持的运行时函数得到改进时,这个 trait 可能会以某种方式被取代。
目前,此 trait 可用于对可能缺乏硬件支持的 SIMD 浮点操作进行试验,例如 mul_add
。
Required Methods§
Provided Methods§
sourcefn mul_add(self, a: Self, b: Self) -> Self
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
的性能可能比未融合的乘加性能更高。
然而,这并不总是正确的,并且将在很大程度上依赖于设计具有特定目标硬件的算法。
sourcefn sqrt(self) -> Self
fn sqrt(self) -> Self
🔬This is a nightly-only experimental API. (
portable_simd
#86656)产生一个 vector,其中每个 lane 都具有 self
中等效索引 lane 的平方根值
sourcefn ceil(self) -> Self
fn ceil(self) -> Self
🔬This is a nightly-only experimental API. (
portable_simd
#86656)返回大于或等于每个 lane 的最小整数。
sourcefn floor(self) -> Self
fn floor(self) -> Self
🔬This is a nightly-only experimental API. (
portable_simd
#86656)返回小于或等于每个 lane 的最大整数值。