如何替换" fmod()"通过整数" mod()"函数

时间:2017-02-20 11:11:11

标签: c++ performance modulo

我的程序性能下降,因为函数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作为任意数字进行乘法,以确保我的数字不再有小数。

数学库中是否有某种函数给出了数字的最后一个小数的大小? (希望这个功能不会过多地降低性能:-))

2 个答案:

答案 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))或创建内联函数,进行此计算,已经显着增加了行为。