gpt4 book ai didi

c - `isnan()` 与测试相等性一样快吗?

转载 作者:太空宇宙 更新时间:2023-11-04 06:21:35 27 4
gpt4 key购买 nike

在 C 语言中,测试一个 float 是否为 NaN 是否与测试两个 float 是否相等一样快?也就是说,isnan() 与两个 float 之间的简单相等性测试一样快?

我特别感兴趣的是在标准的现代 Intel/AMD 平台上使用 gcc

这是一段 C 代码示例。

#include <math.h>
int main(double x)
{
return isnan(x);
}

最佳答案

在 x64 上使用 GCC,math.hisnan(float)编译为

jmp __isnanf

使用尾调用优化,但有效地调用了一个函数。被调用的函数将不得不做一些相当于代码的事情,至少我没有看到任何更快的实现它的方法。然而,这留下了一个问题,即它与未回答的比较相比如何。

但这并没有说明“测试 float 是否为 NaN”的速度有多快,因为不只有一种方法可以做到这一点。最直接的方式,

int isnan2(float x)
{
return x != x;
}

从字面上看,与在 C 级别比较 float 是一回事。但是 GCC 做到了这一点:

xor eax, eax
ucomiss xmm0, xmm0
setp al
ret

这与比较两个 float 并不完全相同,但很接近,而且实际上更快一些。测试相等性意味着测试无序情况,就像这里一样,但是 z 标志也必须测试,就像这样(再次来自 gcc)

xor eax, eax
mov edx, 1
ucomiss xmm0, xmm1
setp al
cmovne eax, edx
ret

奖励:使用 <cmath>使 isnan编译为与将 float 与自身进行比较相同的东西,请参阅链接问题了解原因。

Godbolt link for convenience

我现在看到你实际上有 double ,但这并没有改变任何质量。

关于c - `isnan()` 与测试相等性一样快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33922103/

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