在C编程中,如果表达式中的任何变量为nan,则计算会更慢

Vis*_*ngh 5 c nan

这完全是一个假设的问题.

在下面的代码中,我正在执行计算,它将一个变量z作为指定为"nan"的值.与正常z值相比,主要计算会更慢(如z = 1.0)

float z = 0.0/0.0; // that means z is "nan"
float p = 50.0, q = 100.0, r = 150.0;
// main calculation Type 1
float c = ((x*100)+(y*100))/(x*100)+(y*100)+152*(p+q/r)+z;
Run Code Online (Sandbox Code Playgroud)

以下是显示具有正常z值的主要计算的示例

float z = 1.0; // normal value for z
float p = 50.0, q = 100.0, r = 150.0;
// main calculation Type 2
float c = ((x*100)+(y*100))/(x*100)+(y*100)+152*(p+q/r)+z;
Run Code Online (Sandbox Code Playgroud)

因此,哪一个较慢,类型1还是类型2?或者没有时差?在单次计算中,时间差可能不可见,但是,如果我们收集数百万个这样的方程,时间结果会如何变化?

任何形式的思想,逻辑或信息都将受到赞赏.

注意:目前我并不关心变量'c'的结果值;

ric*_*ici 5

这取决于CPU.旧的x86 intel芯片,没有SSE,处理NAN非常糟糕(请参阅http://www.cygnus-software.com/papers/x86andinfinity.html进行10年的分析.)但是,SSE2/3/4没有我遇到这个问题,我不相信AMD曾做过.

你可能会在现代芯片上看到这个问题,如果你告诉你的编译器避免SSE指令可能的兼容性(但无论NaN如何,这肯定会减慢浮点数,所以除非你必须这样做,否则不要这样做.)就我而言知道,这种兼容模式仍然是x86版本的gcc默认值.

我不知道ARM浮点单元; 你必须测试.

我怀疑NANs不是他们十年前的问题,但是有足够的人对这些时代的模糊记忆无疑将会存在一段时间的偏见.