gpt4 book ai didi

c - 是否有任何数字可以对 float 进行快速模计算?

转载 作者:太空狗 更新时间:2023-10-29 16:10:16 25 4
gpt4 key购买 nike

我知道对于无符号整数,如果除数是 2 的幂,我可以用位掩码替换模运算。是否有任何数字具有类似的 float 属性?也就是说,是否有任何数字 n 可以比一般情况更有效地计算 f mod n,而不必使用位掩码?

当然,除了一个。 大脑衰竭

编辑:澄清一下,f 是任何 float (在运行时确定),n 是任何格式的任何编译时常数,我希望结果是一个 float 。

最佳答案

如果 n == 1.0n == -1.0,那么您可以:

r = f - trunc(f);

在 x86_64 上,trunc通常会使用 ROUNDSD 指令,所以这会非常快。

如果 n 是 2 的次方且幅度大于或等于 1,并且您的平台有一个 fma原生函数(对于 Intel,这意味着 Haswell 或更新版本),那么你可以这样做

r = fma(-trunc(f / n), n, f);

任何合理的编译器都应该将除法转换为乘法,并将否定折叠到适当的 FMA(或常量)中,从而产生乘法、截断和 FMA。

这也适用于 2 的较小次方,只要结果不溢出(这样编译器就不能随意替换它)。

是否有编译器真的会这样做是另一回事。浮点余数函数使用不多,也没有引起编译器编写者的太多关注,例如https://bugs.llvm.org/show_bug.cgi?id=3359

关于c - 是否有任何数字可以对 float 进行快速模计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49139283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com