【问题标题】:How to replace "fmod()" by integer "mod()" function如何用整数“mod()”函数替换“fmod()”
【发布时间】:2017-02-20 11:11:10
【问题描述】:

由于函数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 作为任意数字进行相乘,以确保我的数字不再有小数。

数学库中是否有某种函数可以提供数字最后一位小数的大小? (希望是一个不会过多降低性能的功能:-))

【问题讨论】:

  • 很多小数会变成重复的浮点小数,所以没有办法知道小数点有多少。
  • 您的限制因素很可能基于std::numeric_limits&lt;int&gt;::digits10 而不仅仅是您的浮点数中的实际数字。

标签: c++ performance modulo


【解决方案1】:

这个怎么样:

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

【讨论】:

  • 这不是一个好主意:我想提高性能,尽管您的算法看起来正确,但添加循环会降低性能(想象一下a=1000000b=0.000001 的情况)。
【解决方案2】:

同时我找到了一些其他解决我的问题的方法:似乎fmod() 是一个非常慢的函数,用其他东西替换它确实是个好主意,但实际上不需要用整数计算:简单地创建一个#define fmod(a,b) ((a) - ((int)((a)/(b))) * (b)) 或创建一个内联函数,进行这种计算,已经显着增加了行为。

【讨论】:

    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 2013-12-18
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多