2011-03-30 141 views

回答

0

这取决于你在说什么类型的计算。无论数量的大小如何,将两个数字加在一起可能需要相同的时间长度。在分割的情况下,操作数的大小可以有所作为的 - 例如,看到Intel reference manual页C.34:

如果您尝试编译下面的代码,你可以在行动中看到这一点:

// Compile with -O0 to avoid optimising out loop! 
#include <iostream> 
#include <sys/time.h> 
#include <limits> 

void test(float a, float b) 
{ 
     struct timeval start, end; 
     gettimeofday(&start, NULL); 
     for (size_t i=0; i<500000; ++i) 
     { 
       float result = a/b; 
     } 
     gettimeofday(&end, NULL); 
     long seconds, useconds; 
     seconds = end.tv_sec - start.tv_sec; 
     useconds = end.tv_usec - start.tv_usec; 
     double ms = ((seconds) * 1000 + useconds/1000.0); 
     std::cout << a << "/" << b << " takes " << ms << "ms" << std::endl; 
} 

int main() 
{ 
     test(1,2); 
     test(0.0005,1.0e+35); 
} 

给出我

1/2以下输出取1.032ms

0.0005/1E + 35需要32.287ms

+0

您需要确保关闭优化器以进行这些测试,但实际上它们在某些情况下可以完全优化代码。 – Chad 2011-03-30 11:38:30

+0

是的,这很重要!我已经在代码中注释了这个效果,但值得重申... – Matt 2011-03-30 11:40:20

+0

优化器不仅可以删除该行,而且不太具有侵略性的还可以将其转换为乘法(计算'1/b'一次,乘以500.000倍) – MSalters 2011-03-30 16:10:15

4

据我了解处理器是如何工作的,应该有绝对的所有

0

没有什么区别,我相信没有差异,当这些数字可以在同一个数据类型坐。

1

不,根本没有区别(忽略精确度问题)。浮点数字总是使用符号,分数和指数表示一个数字。根据它的“大小”不能有任何区别,并且在小数字或整数时使用某种整数替换不会有任何意义(只会导致额外的开销) - 计算您必须将它们转换无论如何。

4

这一切都取决于用于计算浮点数的平台。一般来说,应该几乎没有差别。在内部,使用规范化的尾数(0.5到1.0之间的值),符号和指数来表示浮点数。小数和大数的区别在于指数的值。

话虽如此,有一个显着的例外。真的很小的浮点数,所谓的低于正常数非正规化数表示方式不同,有些FPU不支持它们。在这种情况下,他们逃到软件来执行计算,这非常慢。具体来说,这是一个音频软件中的一个问题,在这种软件中,声音可能会衰减到无法听到的声音,但一旦它足够小,就会使计算速度显着减慢。