5

这完全是一个假设性的问题。

在下面的代码中,我正在执行计算,它有一个变量 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;

这是一个示例,显示具有正常 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;

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

任何类型的想法、逻辑或信息都会受到赞赏。

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

4

4 回答 4

5

这取决于 CPU。没有 SSE 的旧 x86 英特尔芯片对 NAN 的处理非常糟糕(请参阅http://www.cygnus-software.com/papers/x86andinfinity.html了解 10 年前的分析。)但是,SSE2/3/4 没有t遭受这个问题,我不相信AMD曾经这样做过。

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

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

我怀疑 NAN 已经不是十年前的问题了,但有足够多的人对那些时代有模糊的记忆,这种偏见无疑会持续一段时间。

于 2013-09-20T06:27:42.770 回答
1

批判性思考真的让我挑战了我对 C 的理解。我认为最好的答案是实验。使用 time.h 保存每次计算前后的时钟时间并计算差异。

#include<stdio.h>   
#include<time.h> 
clock_t t1, t2;
float result;

t1 = clock();
//perform calculation1
t2 = clock();
printf("%f", result);

t1 = clock();
//perform calculation2
t2 = clock();
printf("%f", result);
于 2013-09-20T06:16:07.610 回答
1

在某些 RISC 架构(例如MIPS)上,浮点单元旨在尽可能快地处理常见情况。浮点单元在遇到 NaN 时会陷入陷阱,然后使用软件 IEEE 浮点仿真器处理剩余的计算。因此,在这样的架构上使用 NaN 进行计算会慢得多。AFAIK 这不适用于 Intel x86 架构。

于 2013-09-20T06:31:07.500 回答
-1

不会有什么区别。

在低级别,计算机只是分配值。不检查以前那里有什么。

计算的汇编代码必须相同。

如果您检查整个代码,第一个程序必须较慢,因为您在其中进行了额外的计算。(0.0/0.0)。

于 2013-09-20T06:17:09.630 回答