Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Fakultät

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
17.11.2005, 18:55 Uhr
bayerischbeer



Hi, also ich bin noch voll der noob in c++ bitte trotzdem um hilfe...
Habe folgendes problem, Ich soll die die eulersche zahl e auf 17 stellen genauigkeit berechnen, dieformel setzt sich so zu sammen:
Summe aus 1/1! +1/2! +1/3! + 1/4! ... (! ==> Fakultät)
Hab damit eigentlich kein problem, (n=n*z; z++ ) ABER:
mein dummer c++ lehrer will unbedingt haben, dass ich nicht 2 long double variablen hernehmen darf, sondern für die fakultät integer hernehmen soll, hat mir den tipp gegeben dass ich dann irgendwie das ergebnis der fakultät in einer zwischenvariablen gespeichert werden soll oder so.
Ich komm einfach nicht drauf, und googlen hilf mir auch nicht weiter.
Hat einer eine idee?
Viele grüße Harry
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.11.2005, 19:02 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ich versteh das Problem irgendwie nicht wirklich...
Erklär mal bitte nochmal...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.11.2005, 19:08 Uhr
bayerischbeer



Also, ich hätte das programm so geschrieben:

Zitat:
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{

int z = 1;
long double x = 1;
long double n = 1;

cout << '\n';

for (z = 1 ; z < 22; z++)
{
n = n * z;
x = x + 1/n;

cout << fixed << setprecision(34) << x << '\n';
}

cout << '\n' << "Die Angabe der Zahl lautete: " << "2.7182818284590452353602874713526625" << '\n';
cout << "Die berechnete Zahl lautete: " << x << endl;
cout << '\n';

return 0;
}



Jetzt sagt er aber dass ich im gesamten programm nur 1 long double verwenden darf (was dann natürlich x ist)
Somit muss ich n und eben noch hilfsvariablen irgendwie mit integer deklarieren und so das programm zum laufen bekommen...

Dieser Post wurde am 17.11.2005 um 19:08 Uhr von bayerischbeer editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.11.2005, 19:14 Uhr
Hans
Library Walker
(Operator)


@Windalf: das mit der Fakultät als integer ist eigentlich ganz Sinnvoll, schliesslich sind das ja immer ganze Zahlen. Das Problem wird wohl irgendwo beim umsetzen in der Formel liegen... - hab aber auch keine Kristallkugel...

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 17.11.2005 um 19:20 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.11.2005, 19:22 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



C++:
long double x = 0;
int n=1;
for (int i=1;i<22 ;n*=++i)x+=1.0/n;


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.11.2005, 19:24 Uhr
bayerischbeer



Danke, ich teste es mal aus, aber bekomm ich so nicht einen überlauf?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.11.2005, 19:28 Uhr
Pler
Einer von Vielen
(Operator)


was läuft über?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.11.2005, 19:30 Uhr
bayerischbeer



Also soweit so gut,
aber die genauigkeit ist nur sieben stellen nach dem komma.
Mit überlauf meinte ich einen gleitkommafehler, war aber nicht der fall...

Dieser Post wurde am 17.11.2005 um 19:46 Uhr von bayerischbeer editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
17.11.2005, 19:34 Uhr
Hans
Library Walker
(Operator)


Wahrscheinlich meint er, das er irgendwann den integer Wertebereich verlässt. Kann gut sein, ich weiss aber nicht wann. (Und hab jetzt auch keine Lust das zu testen.)

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.11.2005, 19:47 Uhr
0xdeadbeef
Gott
(Operator)


Ich geh mal einfach davon aus, dass die Zahl der Iterationen nicht festgecodet sein soll und benutze stattdessen nen Epsilon-Vergleich. Ansonsten sollte n ein unsigned long long sein, da bereits 13! den Wertebereich eines int auf einem x86 sprengt. Ich stell mir das so vor:

C++:
#include <iostream>
#include <iomanip>

long double const EPSILON = 1e-18L;

int main() {
  unsigned long long n = 1ULL;
  long double x = 1.0L;

  for (int z = 1; 1.0L / n > EPSILON; ++z) {
    n *= z;
    x += 1.0L / n;
    
    std::cout << std::fixed << std::setprecision(34) << x << '\n';
  }

  std::cout << "Die angegebene Zahl lautet: 2.7182818284590452353602874713526625\n"
               "Die berechnete Zahl lautet: " << x << std::endl;
  return 0;
}


Wobei noch anzumerken ist, dass setprecision(34) angesichts dessen, dass ein long double auf gängigen Architekturen höchstens 32 Stellen speichern kann, übertrieben ist.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 17.11.2005 um 19:49 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: