【发布时间】: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<int>::digits10而不仅仅是您的浮点数中的实际数字。
标签: c++ performance modulo