使用系列时提高精度
Improve precision when working with series
我被分配了一项研究黎曼假说变体的任务。我在下面创建了以下内容,效果很好,但我意识到,使用整数除法,我已经到了无法再运行测试结果的地步(大约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
,因为前者很容易访问数组/指针的最后一个元素。
相关文章:
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 高精度双精度的 Sprintf 格式化问题
- 在 Windows/C++ 上使用多进程应用程序的高精度定时操作
- 空间旋转矢量,C++精度高
- 双倍精度太高
- 高精度线程同步
- 高精度计算平均值的最佳策略
- 如何在没有浮点数/双精度数的情况下生成均匀和高斯分布的伪随机数
- odeint:复杂且更高的精度类型
- 不能使C++程序使用足够高的精度
- 跨平台C++高精度事件定时器实现
- 如何打印出精度更高的双数
- 将字符串解析为浮点时精度更高
- 高精度事件计时器
- C++:高精度随机双精度数
- 如何在C++中以高精度生成随机双精度数
- 使用boost-lib的更高精度浮点(高于16位)
- 如何获得比Windows XP上的计时器滴答(15毫秒)更高精度的时间
- 与PostgreSQL一起工作时,SOCI库中的高精度时间戳
- 用于高精度浮点数的c++类型