Formatierung mit fprintf und Wertebereich für Fibonacci?

Hallo,

der Wertebereich von double ist bei 8 Byte 1.79769E+308, aber selbst wenn - werden damit Deine Zahlen größer als 10-stellig, so wie zuvor von deepthroat schon ausgeführt! Und Deine Vorgabe ist doch eine solche Ausgabe!!

Und somit ist die max. Zahl auf 9.999.999.999 festgelegt ...... :rolleyes:

Gruß
Klaus
 
Hallo,

der Wertebereich von double ist bei 8 Byte 1.79769E+308, aber selbst wenn - werden damit Deine Zahlen größer als 10-stellig, so wie zuvor von deepthroat schon ausgeführt! Und Deine Vorgabe ist doch eine solche Ausgabe!!

Und somit ist die max. Zahl auf 9.999.999.999 festgelegt ...... :rolleyes:

Gruß
Klaus

Nein, es geht darum, dass intern die richtigen Zahlen berechnet werden, aber dann bei der Ausgabe nur maximal 10-stellig erscheinen, praktisch also einfach abgeschnitten werden.

Habe jetzt meine Lösung mit der int-Umsetzung eingereicht, mit dem Hinweis, dass es mir nicht möglich war einen Datentyp für die korrekten Fibonaccizahlen zu finden.
Gerade eben kam folgende E-Mail:

Nur mit einer Langzahlimplementierung gibt es die "coole" Note.
[...]

Also irgendwas muss es da wohl doch geben!
 
Du könntest dir auch eine Klasse dafür schreiben aber ehrlich gesagt finde ich das auch ziemlich übertrieben :)

Wie würde diese Klasse denn in etwa (mit Worten) aussehen?

Vorschläge aus einem anderen Forum:
long int
long long
Darstellung mit Exponenten
oder
auch verkürze Dartsellung durch Modulorechnung
nach diesem Prinzip:
Code:
#include <stdint.h>

// ...

uint64_t x, y, z;

// ...

z = x + y % UINT64_C(100000000000);
 
Hi.

Die Sinnhaftigkeit der Aufgabenstellung würde ich jetzt mal arg bezweifeln.

Vermutlich möchte dein Dozent, dass ihr die Aufgabe mit dem Datentyp double umsetzt.

Die Berechnung der Fibonaccizahlen mit double wird allerdings schon bei der 79 Zahl falsch (was an der inhärenten Ungenauigkeit von double liegt). Deswegen hatte ich dir den Typ double nicht für die Berechnung empfohlen.

Betrachtet man allerdings immer nur die ersten 10 signifikanten Stellen dieser Zahlen, dann ist der Fehler dort nicht erkennbar, obwohl der Fehler bei der 500. Fibonaccizahl auf meinem Rechner bereits bei
einhunderteinundachtzig Quattuordezilliarden achthundertneun Quattuordezillionen zweihundertvierunddreissig Tredizilliarden siebenhundertneunundsechzig Tredizillionen acht Duodezilliarden zweihundertvierzehn Duodezillionen zweihundertfünfundsechzig Undezilliarden zwei Undezillionen einhundertfünfundfünfzig Dezilliarden siebenhundertelf Dezillionen zweihundertdreiundvierzig Nonilliarden neunhundertsechzehn Nonillionen neunhundertdreiundachtzig Oktilliarden dreihundertfünfundneunzig Oktillionen dreihundertdreiunddreissig Septilliarden neunhundertzweiunddreissig Septillionen vier Sextilliarden sechshundertzweiundfünfzig Sextillionen neunhundertfünfundsiebzig Quintilliarden vierhundertzweiunddreissig Quintillionen zweihundertsiebenundfünfzig Quadrilliarden vierhundertzweiundzwanzig Quadrillionen neunhundertneunzehn Trilliarden sechshundertdreiundneunzig Trillionen achthundertzwölf Billiarden zweihunderteinundvierzig Billionen einhundertdreiundachtzig Milliarden vierunddreissig Millionen dreihunderteinundneunzigtausendachthundertdreiundfünfzig liegt :)

Gruß
 
*lol* Das hast du jetzt aber nicht ernsthaft alles getippt? :eek:

Wie kommst du jetzt auf einmal doch auf double? Bei double hab ich halt wieder das Problem mit der Formatierung...ich kann zwar die Nullen weglassen (was ja verlangt wird) aber das mit der Begrenzung auf 10 Stellen ist nicht möglich.

Was hälst du von einem ganz anderen Ansatz: Es wird nicht verlangt die Zahlenreihe selbst in einem Vektor abzulegen sondern JEDE Zahl in einem Vector selbst (dieser Vector hat dann lauter int Werte...jedes Vektorelement ist eine Ziffer der gesamten Fibonaccizahl) ...und dann jeden dieser Vektoren in einem Gesamtvektor, welcher dann die Zahlenreihe darstellt.
Somit könnte ich doch sehr lange Zahlen darstellen, allerdings muss ja vor dem Ablegen im Vektor erstmal ein Datentyp her mit dem gerechnet werden kann.
Schon sehr kompliziert alles irgendwie und wie ich das implementieren soll ist mir irgendwie schleierhaft, vorallem als Anfänger.

Eigentlich sollte die Übung ja dazu dienen mal einen Vektor selbst zu implementieren und nicht mit ewig langen Fibonaccizahlen zu hantieren :rolleyes:

Hi.

Die Sinnhaftigkeit der Aufgabenstellung würde ich jetzt mal arg bezweifeln.

Vermutlich möchte dein Dozent, dass ihr die Aufgabe mit dem Datentyp double umsetzt.

Die Berechnung der Fibonaccizahlen mit double wird allerdings schon bei der 79 Zahl falsch (was an der inhärenten Ungenauigkeit von double liegt). Deswegen hatte ich dir den Typ double nicht für die Berechnung empfohlen.

Betrachtet man allerdings immer nur die ersten 10 signifikanten Stellen dieser Zahlen, dann ist der Fehler dort nicht erkennbar, obwohl der Fehler bei der 500. Fibonaccizahl auf meinem Rechner bereits bei
einhunderteinundachtzig Quattuordezilliarden achthundertneun Quattuordezillionen zweihundertvierunddreissig Tredizilliarden siebenhundertneunundsechzig Tredizillionen acht Duodezilliarden zweihundertvierzehn Duodezillionen zweihundertfünfundsechzig Undezilliarden zwei Undezillionen einhundertfünfundfünfzig Dezilliarden siebenhundertelf Dezillionen zweihundertdreiundvierzig Nonilliarden neunhundertsechzehn Nonillionen neunhundertdreiundachtzig Oktilliarden dreihundertfünfundneunzig Oktillionen dreihundertdreiunddreissig Septilliarden neunhundertzweiunddreissig Septillionen vier Sextilliarden sechshundertzweiundfünfzig Sextillionen neunhundertfünfundsiebzig Quintilliarden vierhundertzweiunddreissig Quintillionen zweihundertsiebenundfünfzig Quadrilliarden vierhundertzweiundzwanzig Quadrillionen neunhundertneunzehn Trilliarden sechshundertdreiundneunzig Trillionen achthundertzwölf Billiarden zweihunderteinundvierzig Billionen einhundertdreiundachtzig Milliarden vierunddreissig Millionen dreihunderteinundneunzigtausendachthundertdreiundfünfzig liegt :)

Gruß
 
*lol* Das hast du jetzt aber nicht ernsthaft alles getippt? :eek:
Nein, das hab ich das Numerical Chameleon machen lassen... :)
Wie kommst du jetzt auf einmal doch auf double? Bei double hab ich halt wieder das Problem mit der Formatierung...ich kann zwar die Nullen weglassen (was ja verlangt wird) aber das mit der Begrenzung auf 10 Stellen ist nicht möglich.
Du könntest die Zahl ja erstmal in einen String schreiben (mit sprintf) und danach nur die ersten 10 Ziffern ausgeben.
Was hälst du von einem ganz anderen Ansatz: Es wird nicht verlangt die Zahlenreihe selbst in einem Vektor abzulegen sondern JEDE Zahl in einem Vector selbst (dieser Vector hat dann lauter int Werte...jedes Vektorelement ist eine Ziffer der gesamten Fibonaccizahl) ...und dann jeden dieser Vektoren in einem Gesamtvektor, welcher dann die Zahlenreihe darstellt.
Somit könnte ich doch sehr lange Zahlen darstellen, allerdings muss ja vor dem Ablegen im Vektor erstmal ein Datentyp her mit dem gerechnet werden kann.
Schon sehr kompliziert alles irgendwie und wie ich das implementieren soll ist mir irgendwie schleierhaft, vorallem als Anfänger.
Ja, soetwas kann man machen. Allerdings kannst du dort keine Standardoperationen verwenden und mußt erstmal die Addition auf diesem selbstdefinierten Datentyp definieren.
Eigentlich sollte die Übung ja dazu dienen mal einen Vektor selbst zu implementieren und nicht mit ewig langen Fibonaccizahlen zu hantieren :rolleyes:
Wie gesagt, der Sinn der Aufgabe erschließt sich mir nicht so ganz...

Gruß
 
Einen wunderschönen guten Tag,

Die 1000. Fibonacci-Zahl hat lediglich 208 Dezimalstellen. Damit ist nur noch etwas mit BigInteger zu machen, wenn es sowas in C++ gibt.

Hallo!
Ich muss die Fibonaccizahlen bis zu einem maximalen Wert von 1000 (vorgegeben durch Aufrufparameter) in einer Textdatei formatiert ausgeben.

Wieso wollt ihr die Fibonacci-Zahlen überhaupt ganz genau berechnen? So wie ich das verstanden habe, sollen doch nur die ersten 10 Stellen ausgegeben werden. Damit brauch auch die Genauigkeit nicht besser zu sein.

Du verwendest somit einfach den Datentyp double, speicherst dir die Fibonacci-Zahlen in einem Array und gibst diese dann mit der geforderten Formatierung aus. Ich denke diese Lösung entspricht auch den Anforderungen der Aufgabenstellung.

Was hälst du von einem ganz anderen Ansatz: Es wird nicht verlangt die Zahlenreihe selbst in einem Vektor abzulegen sondern JEDE Zahl in einem Vector selbst (dieser Vector hat dann lauter int Werte...jedes Vektorelement ist eine Ziffer der gesamten Fibonaccizahl) ...und dann jeden dieser Vektoren in einem Gesamtvektor, welcher dann die Zahlenreihe darstellt.
Somit könnte ich doch sehr lange Zahlen darstellen, allerdings muss ja vor dem Ablegen im Vektor erstmal ein Datentyp her mit dem gerechnet werden kann.
Schon sehr kompliziert alles irgendwie und wie ich das implementieren soll ist mir irgendwie schleierhaft, vorallem als Anfänger.

Dazu schreibst du am besten eine Klasse, die eine doppelt verkettete Liste der Ziffern der Fibonacci-Zahl speichert. Zur Addition nimmst du dir die jeweils letzten Dezimalstellen (Liste ganz hinten) und berechnest die Summe. Alles was größer als 9 ist wird zum Überschlag. Dann gehst du eine Dezimalstelle weiter vor, wie die schriftliche Berechnung einer Summe. Neu berechnete Dezimalstellen hängst du vorn im Ergebnis ein. Zum Auslesen kannst du dann die ersten 10 Stellen der Liste bequem ausgeben. Dann legst du dir noch ein Array für 1000 Fibonacci-Zahlen an mit den Datentyp deiner Klasse. Damit lassen sich (fast alle) Fibonacci-Zahlen genau berechnen. Der Aufwand ist um einiges höher. Und als Anfänger, denke ich, ist diese Aufgabe zu kompliziert, zumal ihr noch Arrays erlernen sollt.

Gruss
Mizi
 
Zuletzt bearbeitet:
Zurück