Ich versuche, einen einfachen Gradienten-Abstieg-Algorithmus in C++ (für 10.000 Iterationen) zu schreiben. Hier ist mein Programm:Warum bekomme ich immer Nan als Ausgabe?
#include<iostream>
#include<cmath>
using namespace std;
int main(){
double learnrate=10;
double x=10.0; //initial start value
for(int h=1; h<=10000; h++){
x=x-learnrate*(2*x + 100*cos(100*x));
}
cout<<"The minimum is at y = "<<x*x + sin(100*x)<<" and at x = "<<x;
return 0;
}
Die Ausgabe endet als: y = nan und x = nan. Ich habe versucht, die Werte von x und y zu betrachten, indem ich sie in eine Datei lege, und nach einer bestimmten Anzahl von Iterationen bekomme ich alle Nans (für x und y). edit: Ich habe die Lernrate (oder Schrittgröße) als Experiment auf 10 gesetzt, danach verwende ich viel kleinere Werte.
Was ist der Wert von 'x' kurz bevor es' NaN' wird? – NathanOliver
Stellen Sie sicher, dass alle Ihre Operationen Doubles beinhalten und dass Ihre Ganzzahl-Literale/-Konstanten keine impliziten Konvertierungen verursachen. – Dai
Hallo. Der letzte x-Wert vor nan ist: -1.7761e + 307. Wenn es darauf ankommt, ist der letzte Wert für y 3.96343e + 307 und danach, für mehrere weitere Werte, sagt er "inf" für y, und x hat noch nummerierte Werte und dann werden beide x und ynan. (@NathanOliver) – user8697693