我的程序性能下降,因为函数fmod()
被多次调用,现在我正在尝试使用整数mod
,用C ++编写的解决方法作为%
):
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
作为任意数字进行乘法,以确保我的数字不再有小数。
数学库中是否有某种函数给出了数字的最后一个小数的大小? (希望这个功能不会过多地降低性能:-))
答案 0 :(得分:0)
这个怎么样:
if (a > 0)
while (a > b) a -= b;
else
while (a < -b) a += b;
答案 1 :(得分:0)
与此同时,我找到了一些解决我问题的方法:似乎fmod()
是一个非常慢的函数,用其他东西替换它确实是一个好主意,但是没有必要实际替换它通过整数计算:简单地创建#define fmod(a,b) ((a) - ((int)((a)/(b))) * (b))
或创建内联函数,进行此计算,已经显着增加了行为。