发现gcc里的log2函数运行很慢
c4droid吧
全部回复
仅看楼主
level 5
tomkyte 楼主
比log函数慢很多,运行不出来。
#include <iostream>
#include <cmath>
#include <ctime>
int main()
{
int a[20];
for(int i=0;i<20;i++)
a[i]=1<<i;
int t=clock();
double lg2=log(2);
long long sum=0LL;
for(int j=0;j<(1<<20);j++)
for(int i=0;i<20;i++)
{
sum+=(int)round(log(a[i])/lg2);
}
printf("use log\t%lld,%dms\n",sum,clock()-t);
t=clock();
sum=0LL;
for(int j=0;j<(1<<20);j++)
for(int i=0;i<20;i++)
{
sum+=(int)log2(a[i]);
}
printf("use log2\t%lld,%dms\n",sum,clock()-t);
return 0;
}
同样的程序在windows下是
D:\>a
use log 199229440,2230ms
use log2 199229440,1217ms
2016年11月12日 07点11分 1
level 5
tomkyte 楼主
2016年11月14日 04点11分 2
level 5
tomkyte 楼主
虽然运行了,但是不但慢,而且结果错误
2016年11月14日 04点11分 3
level 1
【一品素材】为专业人士提供方案图纸、素材打包下载,视频教程c4droid资料
2016年11月14日 05点11分 5
level 5
tomkyte 楼主
2016年11月14日 12点11分 6
level 5
tomkyte 楼主
最简单的都算错,看来是c4droid的gcc库的bug
2016年11月14日 12点11分 7
level 11
呵呵。你用的int已经溢出了,不出错那都见鬼了。
至于GCC的错误,我只能说那么大的社区,公司,个人都在维护的一个东西,不可能会出现低级错误的。
2016年11月15日 01点11分 8
好吧,是我看错了。你就当我是一本正经的胡说8道就行了,嗯,就是这样。
2016年11月15日 01点11分
level 5
tomkyte 楼主
这样可以了
#include <iostream>
#include <cmath>
//#include <cstdio>
using namespace std;
int main()
{
int a[20];
for(int i=0;i<20;i++)
a[i]=1<<i;
double lg2=log(2);
float sumf=0.0d;
for(int i=0;i<20;i++)
//cout<< log2((float)a[i]) <<endl;
{printf("%d %d %lf %d\n",i,a[i],log2((float)a[i]),1);
sumf+=log2((float)a[i]);
}
float f=log2(2);
cout << log2(64)<<f<<endl<<sumf;
return 0;
}
2016年11月17日 03点11分 9
似乎是编译器选错不同重载函数,同样的写法在1楼上仍是错误。问题还没解决。
2016年11月17日 05点11分
level 5
tomkyte 楼主
把log2换成logb,解决了1楼的问题。
2016年11月17日 05点11分 10
level 5
tomkyte 楼主
frexp函数更好
2016年11月17日 07点11分 11
1