在大型计算中仅使用float而不是混合float和int更好吗?

时间:2009-05-19 23:37:23

标签: c objective-c

我有一个相当大的公式,必须每秒计算大约300次。我的大多数变量都是浮点数,但有些变量只是进入该公式的参数。在某些情况下,不需要浮动。我可以使用int参数。但我想知道在计算中混合int和float类型是否会导致系统周围的类型,而不是保存性能。

5 个答案:

答案 0 :(得分:4)

首先,是的,系统将转换变量,以便它可以在公共基类型中进行计算。其次,这不是你应该最担心的,除非你已经对你的程序进行了基准测试,并且你知道这是你的瓶颈。

只是为了澄清第一部分,如果你有

double a = 10.0;
int b = 5;
int c = 2;

你的公式是

double d = a + (b / c);

我所知道的大多数系统都会使用整数数学,对于这种情况下的除法运算,然后切换到需要它的浮点数学。简而言之,整数和浮点数学之间的决定是在操作员级别完成的。

答案 1 :(得分:3)

小心假设int操作总是比float操作快。他们可能是孤立的,但moving data between a float register and an int register is shockingly slow on modern processors。因此,一旦您的数据在浮点数上,您应该将它保留在浮点数上以进行进一步计算。

答案 2 :(得分:2)

取决于......结果的正确性对您来说很重要吗?

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int x = 5;
    int y = 2;
    float z = 12.3f;

    float result = z + (x / y);
    printf("%f\n", result);

    result = z + ((float) x) / y;
    printf("%f\n", result);

    return EXIT_SUCCESS;
}

C:\Temp> t
14.300000
14.800000

做什么会给你正确的结果。

答案 3 :(得分:1)

我怀疑有好的经验法则。它可能在很大程度上取决于处理器,编译器以及您正在执行的特定操作组合。设置一个计时器,在计算之前和之后运行,并进行各种调整,看看哪个运行得更快。

原则上,从float转换为int通常会减慢你的速度,因为需要额外的指令才能做到这一点,但在实践中,唯一的方法就是测量。查看各种更改的汇编程序转储可以帮助您获得良好的直觉,但即便如此,处理器可能会以非显而易见的方式管道化甚至重新排序指令。

另外,请务必调查gcc的浮点优化开关,并确保为您使用最佳的开关。

答案 4 :(得分:0)

我会说这取决于什么对你更有意义。在性能方面,最好使用float,因为这样做你不会强制注入次数(大约每秒300次;))。

如果它是在您的代码中经常使用的东西,那么您可以关注它,否则不需要实现任何更改。如果你还没有听到或读过“The Fallacy of Premature Optimisation”这样做,现在可以帮助你。规则是20%的代码需要80%的性能。