Я хочу использовать этот вопрос, чтобы немного улучшить мое общее представление о том, как работает компьютер, поскольку у меня, вероятно, никогда не будет возможности углубленно и глубоко учиться. Заранее извините, если вопрос глупый и вообще бесполезный, но я предпочитаю учиться таким образом.
Я изучаю c ++, я нашел в сети код, который реализует метод Ньютона-Рафсона для нахождения корня функции. Код довольно прост, как вы можете видеть из него, в начале он запрашивает требуемый допуск, и, если я даю «приличное» число, он отлично работает. Если вместо этого, когда он запрашивает допуск, я пишу что-то вроде 1e-600
, программа немедленно завершает работу и выводится Enter starting value x: Failed to converge after 100 iterations
.
Вывод сбойной сходимости должен быть следствием запуска цикла более 100 итераций, но это не так, поскольку цикл даже не запускается. Похоже, что программа уже знает, что не достигнет такого уровня терпимости.
Почему это происходит? Как программа может записать этот вывод, даже если она не пробовала цикл 100 раз?
Редактировать: Кажется, что все бессмысленное (слишком маленькие цифры, слова), которые я пишу, когда он запрашивает допуск, выдает pnew = 0,25, а затем код запускается 100 раз и дает сбой.
Код следующий:
#include <iostream>
#include <cmath>
using namespace std;
#define N 100 // Maximum number of iterations
int main() {
double p, pnew;
double f, dfdx;
double tol;
int i;
cout << "Enter tolerance: ";
cin >> tol;
cout << "Enter starting value x: ";
cin >> pnew;
// Main Loop
for(i=0; i < N; i++){
p = pnew;
//Evaluate the function and its derivative
f = 4*p - cos(p);
dfdx= 4 + sin(p);
// The Newton-Raphson step
pnew = p - f/dfdx;
// Check for convergence and quit if done
if(abs(p-pnew) < tol){
cout << "Root is " << pnew << " to within " << tol << "\n";
return 0;
}
}
// We reach this point only if the iteration failed to converge
cerr << "Failed to converge after " << N << " iterations.\n";
return 1;
}