小浮点数的计算 - 接近0 - 和大浮点数 - 远离0是否有任何区别?
答案 0 :(得分:4)
据我了解处理器的工作方式,应该完全没有区别
答案 1 :(得分:4)
这完全取决于用于计算浮点数的平台。一般来说,应该有很少或没有区别。在内部,使用标准化尾数(0.5和1.0之间的值),符号和指数表示浮点数。小数和大数之间的差异是指数的值。
话虽如此,有一个值得注意的例外。实际上小的浮点数,所谓的次正规数或非规范化数的表示方式不同,有些FPU不支持它们。在那种情况下,他们逃到软件来执行计算,这非常慢。具体地说,这是音频软件中的一个问题,声音会响起无法听到的声音,但一旦声音足够小,就会使计算速度显着降低。
答案 2 :(得分:1)
不,根本没有区别(忽略精度问题)。浮点数始终表示使用符号,分数和指数的数字。根据它的“大小”没有任何差别,并且在小数字或整数的情况下使用某种整数替换将没有任何意义(只是导致额外的开销) - 计算你必须转换它们无论如何。
答案 3 :(得分:0)
我相信当这些数字可以位于相同的数据类型时没有区别。
答案 4 :(得分: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