浮动尺寸的计算成本

时间:2011-03-30 09:51:49

标签: c++ c types floating-point

小浮点数的计算 - 接近0 - 和大浮点数 - 远离0是否有任何区别?

5 个答案:

答案 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