gpt4 book ai didi

c - 钳制真实(固定/浮点)值的最快方法?

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

有没有比使用 if 语句或三元运算符更有效的限制实数的方法?我想为 double 和 32 位定点实现 (16.16) 执行此操作。我不是要求可以处理这两种情况的代码;它们将在单独的函数中处理。

显然,我可以这样做:

double clampedA;
double a = calculate();
clampedA = a > MY_MAX ? MY_MAX : a;
clampedA = a < MY_MIN ? MY_MIN : a;

double a = calculate();
double clampedA = a;
if(clampedA > MY_MAX)
clampedA = MY_MAX;
else if(clampedA < MY_MIN)
clampedA = MY_MIN;

固定点版本将使用函数/宏进行比较。

这是在代码的性能关键部分完成的,所以我正在寻找一种尽可能有效的方法(我怀疑这会涉及位操作)

编辑:它必须是标准/可移植的 C,平台特定的功能在这里没有任何意义。此外,MY_MINMY_MAX 与我想要限制的值类型相同(在上面的示例中为 double 值)。

最佳答案

GCC 和 clang 都为以下简单、直接、可移植的代码生成漂亮的程序集:

double clamp(double d, double min, double max) {
const double t = d < min ? min : d;
return t > max ? max : t;
}

> gcc -O3 -march=native -Wall -Wextra -Wc++-compat -S -fverbose-asm clamp_ternary_operator.c

GCC 生成的程序集:

maxsd   %xmm0, %xmm1    # d, min
movapd %xmm2, %xmm0 # max, max
minsd %xmm1, %xmm0 # min, max
ret

> clang -O3 -march=native -Wall -Wextra -Wc++-compat -S -fverbose-asm clamp_ternary_operator.c

Clang 生成的程序集:

maxsd   %xmm0, %xmm1
minsd %xmm1, %xmm2
movaps %xmm2, %xmm0
ret

三个指令(不包括 ret),没有分支。太棒了。

这是在带有 Core i3 M 350 的 Ubuntu 13.04 上使用 GCC 4.7 和 clang 3.2 测试的。附带说明一下,调用 std::min 和 std::max 的直接 C++ 代码生成了相同的程序集。

这是 double 。对于 int,GCC 和 clang 都生成带有五个指令(不包括 ret)且没有分支的汇编。也很棒。

我目前不使用定点,所以我不会对定点发表意见。

关于c - 钳制真实(固定/浮点)值的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/427477/

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