使用系列时提高精度

Improve precision when working with series

本文关键字:高精度 系列      更新时间:2023-10-16

我被分配了一项研究黎曼假说变体的任务。我在下面创建了以下内容,效果很好,但我意识到,使用整数除法,我已经到了无法再运行测试结果的地步(大约106次运行)。我不确定是否有其他原因可能导致我的程序在大约106次迭代后停止运行。有没有什么方法可以改进这段代码,这样我就可以运行更多的测试结果?

#include <cstdlib>
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
int omegaN(int n){
    int omega[100] = {};
    int sum = 0;
    for (int i = 1; i <= n; i++){
        if ((n%i) == 0 ){
            omega[i] = i;
        }
        sum += (omega[i]);
    }
    cout << "nSum of omega: " << sum << endl;
    return sum;
}
double Hn (int n){
    double sum = 0;
    double h_n;
    double whatBraunWants = 0;
    for (int i = 1.0; i <= n; i++){
        h_n = 1.0/i;
        sum += h_n;
    }
    cout << "Sum of Hn: " << sum << endl;
    whatBraunWants = sum + log(sum) * exp(sum);
    cout << "What Hn plus natural log stuff equals: " << whatBraunWants << endl;
    return whatBraunWants;
}
int main(int argc, char** argv) {
    for (int i = 1; i <= 100; i++){
        cout << "nUsing n = " << i;
        if (omegaN(i) <= Hn(i)){
            cout << "Good for when n = " << i << endl;
        }
        else{
            cout << "No good when n = " << i << endl;
        }
    }
    return 0;
}

好吧,这有点棘手。在线

int omega[100] = {};

omegaN(int n)中,将数组omega的大小固定为100。但是,当omegaN的输入参数n >= 100时,将执行越界访问。你最终会覆盖一些不该覆盖的内存(未定义的行为),所以所有的地狱之旅都会失败。

只需在堆栈上分配更多,如int omega[1024];,或者更好地使用动态分配

int* omega = new int[n]; // now we know for sure we have enough storage space

别忘了去

delete[] omega;

在CCD_ 6从CCD_。

或者,更好的是,使用<memory>(C++11/14)中的智能指针并替换

int omega[100]; 

带有

std::unique_ptr<int[]> omega(new int[n]{}); // or use std::make_unique in C++14

std::unique_ptr析构函数将负责释放内存。

附言:您也可以使用std::shared_ptr,但与数组一起使用有点棘手,因为不幸的是,T[]没有专门化,而且您必须提供自定义的deleter。

PPS:对于循环条件,我也会用i < n替换i <= n,因为前者很容易访问数组/指针的最后一个元素。