Frage

Wir sollen berechnen e^x mit dieser Art der Formel:

e^x = 1 + (x ^ 1 / 1!) + (x ^ 2 / 2!) ......

Ich habe diesen code bisher:

while (result >= 1.0E-20 )
{
    power = power * input;
    factorial = factorial * counter;
    result = power / factorial;
    eValue += result;
    counter++;
    iterations++;
}

Mein problem ist jetzt, dass seit Fakt ist, der Typ long long, kann ich nicht wirklich speichern Sie eine Nummer größer als 20 sein!so was passiert, ist, dass die Programm-Ausgänge lustig zahlen, wenn es erreicht diesen Punkt ..

Die richtige Lösung kann über ein X-Wert von höchstens 709 so e^709 ausgeben sollte:8.21840746155 e+307

Das Programm ist in C++geschrieben.

War es hilfreich?

Lösung

Sowohl x ^ n und n! schnell groß werden mit n (exponentiell und superexponentially respectively) und wird bald überlaufen alle Daten geben Sie verwenden. Auf der anderen Seite, x ^ n / n! geht (schließlich) und Sie können aufhören, wenn es klein ist. Das heißt, nutzt die Tatsache, dass x ^ (n + 1) / (n + 1)! = (X ^ n / n!) * (X / (n + 1)). Wie diese, sagen:

term = 1.0;
for(n=1; term >= 1.0E-10; n++)
{
    eValue += term;
    term = term * x / n;
}

(-Code direkt in dieses Feld eingegeben hat, aber ich erwarte, sollte es funktionieren.)

Edit: Beachten Sie, dass der Begriff x ^ n / n! ist, x für große, für eine Weile erhöht und dann verringert wird. Für x = 709, geht es bis zu ~ 1e + 306 vor auf 0 abnimmt, die nur an den Grenzen ist es, was double umgehen kann (double Palette ist ~ 1e308 und term*x es über drückt), aber long double funktioniert gut. Natürlich Ihre letzte Ergebnis e x ist größer als eine der Bedingungen, so vorausgesetzt, Sie verwenden einen Datentyp groß genug, um das Ergebnis gerecht zu werden, werden Sie sein in Ordnung.

(für x = 709, können Sie mit der Verwendung von nur weg double wenn Sie term = term / n * x verwenden, aber es funktioniert nicht für 710).

Andere Tipps

Was passiert, wenn Sie die Art der factorial von long long ändern double?

Ich denke, der kann eine andere Lösung.Lassen Sie pow(e,x) = pow(10, m) * b wo b ist >=1 und < 10, dann

m = trunc( x * log10(e) )

wo in log10(e) ist ein konstanter Faktor.

und

b = pow(e,x)/pow(10, m ) = pow(e,x)/pow(e,m/log10(e)) = pow (e,x-m/log10(e))

Von diesem erhalten Sie:

z = x-m/log10(e)

die werden zwischen 0, 3 und dann verwenden b = pow(e,z) wie SreevartsR.

und die Letzte Antwort ist

b Basis(signifikante Stelle) und m ist die Mantisse (Größenordnung).

dies wird schneller sein als SreevartsR Ansatz und können Sie nicht brauchen, um verwenden Sie hohe Genauigkeiten.

Viel Glück.

Das wird sogar funktionieren, wenn x kleiner als 0 und größer negativ, in diesem Fall der z-Achse werden zwischen 0 bis -3 und diese werden schneller als jeder andere Ansatz.

Da z -3 bis 3, und wenn Sie benötigen vor 20 signifikanten stellen, dann pow(e,z) - Ausdruck ausgewertet werden kann bis zu 37 Begriffe erst seit 3^37/37!= ~ 3.2 e-26.

Was Sie präsentiert hier ist eine Anwendung von Horner Schema Polynome zu berechnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top