long double hört schon bei 308 Stellen auf!?!?!



  • Hallo, ich bin gerade dabnei eine Fibonacci-Folge zu erstellen, allerdings wird diese sehr lang. Momentan möchte ich 1500 Glieder anzeigen lassen. aber bei der 1476. Zahl (1.3E308) hört es auf. Danach wird nur noch 1.#inf angezeugt. Als Datentyp habe ich long double verwendet. Der sollte doch eigentlich bis 1.1e4932 gehen. Wo liegt der Fehler?

    #include <iostream>
    #include "conio.h"
    #include <cmath>
    
    using namespace std;
    
    int main(void) {
        int k(2);
        long double t1=1.0, tn=1.0, save;
        while(k<1500) {
        save=tn;
        tn=t1+tn;
        t1=save;
        k++;
        cout << "F" << k << "=" << tn << endl;
        }
    
        getch();
        return 0;
    }
    

    P.S: Gibt es auch noch eine Möglichkeit, so lange Zahlen ohne die Zehnerpotenzen anzuzigen und alle Ziffern vollständig anzuzeigen?



  • Ich schätze mal, Du benutzt eine MSVC Version. Da ist long double == double.



  • Gute Frage, die Konstante LDBL_MAX aus <cfloat> gibt bei mir auch infinity aus (gcc - Dev-CPP). Dann nimm als Datentyp doch long long double!



  • Ich nutze gcc Dev-c++. Gibt es da einen anderen Datentyp, der mehr als 1000 Zeichen speichern kann???

    Was soll long long double sein? Da Zeigt mein PC nur noch ganze kurze Zahlen an(ich nehme mal an, in int umgewandelt)



  • Benutz eine spezielle Library wie Gnu MP oder wie das heißt.



  • Das Problem ist nicht der Datentyp long double, sondern wie cout damit umgeht: Ausgabe als double. Ersetz mal versuchsweise cout durch printf.



  • reichs schrieb:

    P.S: Gibt es auch noch eine Möglichkeit, so lange Zahlen ohne die Zehnerpotenzen anzuzigen und alle Ziffern vollständig anzuzeigen?

    Gleitkommazahlen (Typ float, double oder long double) speichern die ganzen Ziffern doch gar nicht, also wozu? Du würdest hunderte von Nullen bekommen.
    double beispielsweise hat eine Mantisse von 53 Bits, das sind etwa 17 signifikante Stellen.
    Am besten würdest du wohl tatsächlich mit einer Bibliothek wie der GMP fahren.



  • ShieTar schrieb:

    Das Problem ist nicht der Datentyp long double, sondern wie cout damit umgeht: Ausgabe als double. Ersetz mal versuchsweise cout durch printf.

    Das stimmt so nicht. Die Präzision von std::cout kann eingestellt werden. Wenn die Typen double und long double bei gewissen Compilern gleich gross sind, werden sie auch gleich ausgegeben.



  • @reichs: wenn du willst dass die Zahlen auch stimmen, dann musst du sowieso eine "big integers" Library verwenden (siehe Bashars Beitrag).

    Bei Gleitkomma würde die Genauigkeit ab dem Zeitpunkt, wo die Mantisse der Gleitkommazahl ausgeschöpft ist, mit jeder weiteren Iteration sinken. Wenn du ab dem Zeitpunkt dann noch z.B. 1000 Iterationen weiter rechnest, kannst du vermutlich gleich ne (sehr lange) Hausnummer hinschreiben. Die wird nämlich mit dem richtigen Ergebnis etwa gleichviel gemeinsam haben, wie die Zahl die du mittels Gleitkomma ausrechnest.


Anmelden zum Antworten