优化c ++查询来计算Nmin

时间:2018-02-18 08:47:03

标签: c++ performance optimization

我遇到了一个问题,我正在尝试优化我的查询,该查询是为了计算增加的​​N值和误差近似值的Nmin值而创建的。 我不是来自编程背景,而是刚刚开始接受它。

这是计算效率低,因为它甚至在找到Nmin后计算Nmin。

现在减少我在下面做的时间减少函数调用没有任何改进:

#include<iostream>
#include<cmath>
#include<time.h>
#include<iomanip>
using namespace std;

double f(int);
int main(void)
{
    double err;
    double pi = 4.0*atan(1.0);
    cout<<fixed<<setprecision(7);
    clock_t start = clock();   

    for (int n=1;;n++)
    {
        if((f(n)-pi)>= 1e-6)
        {
            cout<<"n_min is "<< n <<"\t"<<f(n)-pi<<endl;
        }
        else
        {
            break;
        }       
    }

    clock_t stop = clock(); 
    //double elapsed = (double)(stop - start) * 1000.0 / CLOCKS_PER_SEC; //this one in ms 
    cout << "time: " << (stop-start)/double(CLOCKS_PER_SEC)*1000 << endl;   //this one in s
    return 0;
}
double f(int n)
{

    double sum=0;
    for (int i=1;i<=n;i++)
    {
        sum += 1/(1+pow((i-0.5)/n,2));
    }
    return (4.0/n)*sum; 
}

有没有办法减少时间并使第二个查询有效? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我没有看到任何优化算法本身的直接方法。但是,通过不为每次迭代写入标准输出,可以显着减少时间。此外,每次迭代不要多次计算f(n)。

for (int n=1;;n++)
{
    double val = f(n);
    double diff = val-pi;
    if(diff < 1e-6)
    {
        cout<<"n_min is "<< n <<"\t"<<diff<<endl;
        break;
    }    
}

但请注意,由于我们将条件更改为diff < 1e-6,因此会产生更高的n_min(与版本的结果相比增加1)。