c - f(x) := if x == 0 then 0 else (x * log(x)) 的无分支实现

标签 c optimization nan logarithm branch-prediction

我有这个 C 函数:

double f(int x)
{
    if (x <= 0)
        return 0.0;
    else
        return x * log(x);
}

我在一个紧密的循环中调用它,并且想摆脱分支以查看它是否提高了性能。

我不能使用这个:

double f(int x)
{
    return x * log(x);
}

因为它在 x == 0 时返回 NaN(大约 25% 的时间是正确的。)

是否有另一种实现方式,使其在x == 0 时返回0,但仍然摆脱分支?

(我不太关心负输入,因为这些是错误,而零不是。)

最佳答案

首先注意 log(1) = 0。然后你可以将问题写成 x * log(y),其中如果 x <= 0 则 y = 1,否则等于 x;如果 y = 1,则 x 无关紧要,因为 log(y)=0。

类似 y = (x > 0)*x + (x <= 0) 的东西会这样做,然后:

double f(int x) {
    return x * log((x > 0)*x + (x <= 0));
}

这仅取决于 log(1) 和四个整数操作是否比分支差。

关于c - f(x) := if x == 0 then 0 else (x * log(x)) 的无分支实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13403333/

相关文章:

c - 在 C 中显示文件内容 - 写访问错误

linux - 如何在不读取的情况下访问写入套接字的数据

sql-server - SQL中当前记录日期字段的同一天或之前的累计每日总和

javascript - IIS/.NET的一些类似JAWR的软件(consolidate and minify Javascript)

javascript - 访问对象 key :Value Pair in Function

c - 如何在 ubuntu 服务器中为 STREAMS 安装 IOCTL 手册页?

c - 将 Haskell 中数组的指针传递给 C 函数

c++ - 我是否需要针对不同的指令集制作多个可执行文件?

python - Pandas 比较 Dataframe 中的行

javascript - NaN 错误 - 处理字符串和整数