2017-02-20 51 views
1

由于函数fmod()被调用很多次,我的程序性能下降,现在我正在试验一种解决方法(使用整数mod,在C++写成%):如何用整数“mod()”函数替换“fmod()”函数

double a,b,d; 
    a = 10 * sqrt(2); 
    b = PI; 
    time_t result; 

    result = time(NULL); 
    printf("Time fmod: [%s]\n", asctime(localtime(&result))); 

    for (int i = 0;i < 1000000000; i++) { 
    d = fmod(a,b); 
    } 
    result = time(NULL); 
    printf("Time fmod: [%s]\n", asctime(localtime(&result))); 

    result = time(NULL); 
    printf("Time integer: [%s]\n", asctime(localtime(&result))); 
    for (int i = 0;i < 1000000000; i++) { 
    d = ((double)((int)(1000000*a) % (int)(1000000*b)))/1000000; 
    } 
    result = time(NULL); 
    printf("Time integer: [%s]\n", asctime(localtime(&result))); 

我知道,当a为负,需要做一些更多的工作,但至少为正数,它给出了一个很好的性能提升(18秒而不是110),但有一个明显的问题:在我给出的例子中,我使用1000000作为乘法的任意数字,以确保我的数字不再有小数。

数学库中是否有某种函数让我获得数字最后一位小数的大小? (希望不降低性能的太多:-)功能)

+1

许多小数变成重复的浮点小数,所以没有办法知道有多少小数位。 – Barmar

+0

您的限制因素很可能基于'std :: numeric_limits :: digit10',而不仅仅是您的浮点数内的实际数字。 – Drax

回答

0

同时我发现我的问题的一些其他的解决方案:它似乎fmod()是真的慢函数,并用其他东西代替它确实是一个好主意,但不需要实际用一个整数计算替换它:只需创建一个#define fmod(a,b) ((a) - ((int)((a)/(b))) * (b))或创建一个内联函数,执行此计算就可以显着增加行为。

0

如何:

if (a > 0) 
    while (a > b) a -= b; 
else 
    while (a < -b) a += b; 
+0

这不是一个好主意:我想提高性能,虽然你的算法看起来是正确的,但增加一个循环会降低性能(想象一下'a = 1000000'和'b = 0.000001'的情况)。 – Dominique