long zu klein



  • also ich weiß dass diese frage mir eigentlich schon peinlich sein sollte...aber ich fange eben gerade mit c++ an, und habe dazu auch nichts in der suche gefunden.
    Es geht darum, dass ich ein programm schreiben will, das mir unter anderem auch sehr hohe potenzen ausgeben muss (was so um 64^8 gehen kann) dafür reicht ein long int/float/double aber lange nicht. Gibt es nicht einen viel größeren var-type oder einen der keinen ram platz erst reservieren muss, sondern ihn erst bei hinzuweisung nimmt (is ja nichtmehr so dass man ram im mangel hat)?
    andere programmiersprachen schaffen sowas ja auch...
    wäre nett wenn mir jemand ganz leicht und aussagend antworten würde ohne links auf tuts etc. (das wird doch sicher nur ein wort sein)
    ich habe auch gehört, dass man sich eigene typen generieren kann...
    danke schon im vorraus



  • es gibt libs für große zahlen, mir fällt der name grad nicht ein. schau mal in der suchfunktion, das thema kommt alle dams lang. wennde glück hast schaut mady rein, der hat mit sowas glaub ich schon gearbeitet



  • Falls du MSVC++ oder den BCC verwendest könnte dir __int64 helfen und beim GCC long long. Grösser musst du auf spezielle Libs zurückgreifen, die Suche ist da dein Freund.



  • also mit __int64 hab ichs schon probiert, aber wenn ich dann mit cout << varname; das ergebnis ausgeben lassen will kommt, dass der parameter "<<" zweideutig sei.
    long long hat nicht funktioniert



  • Ich kenn mich mit dem MSVC++ nicht aus, aber probier mal in der Doku ne Möglichkeit zu finden um __int64 in nen String umzuwandeln, welchen du dann ausgibst.



  • In C gibts long double, der muesste in C++ doch auch da sein!

    hat 19 Stellen bis reichlich 10^4000. Das mueste langen.



  • also ich habs mit long double probiert, dann gibt er z.B. 8.24824e+006 o.ä aus
    wegen dem __int64 schau ich mal nach, wobei ich nicht weiß nach was ich suchen soll.



  • in der doku hab ich jetzt gefunden dass es "unsigned long" auch gibt was ich immer mit unsigned long int verwechselt habe, in die aber auch nur die größe bis zu 4294967295 reinpasst...da muss es doch noch eine andere möglichkeit geben...ich will zwar jetzt keinen taschenrechner machen, aber taschenrechner können sowas ja auch



  • Bei 64^8 muss etwas mehr 'rauskommen!

    Bei Formatierung muss "%Lf" angegeben werden! (laut Syntax)



  • wie geht das? könntest du mir da ein codebeispiel geben bitte?



  • Kann nur mit Standard C oder C++ Builder dienen:

    long double Wert=1;
    char Str[256];
    for (int i=0;i<8;i++)
    {
    Wert*=64;
    sprintf(Str,"%Lf",Wert);//Standard in <stdio.h>

    //Memo1->Lines->Add(Str); //Das ist vom CBuilder.
    //Hier musst Du ne eigene Ausgabe machen! 😉
    }



  • danke
    (jetzt müsste ich nurnoch wissen was
    "sprintf(Str,"%Lf",Wert);"
    bewirkt, mach seid 1tag c++ und die umstellung von php auf c++ is größer als ich gedacht habe^^
    ich probiers auf jeden Fall aber wäre nett wenn du mir das noch erläutern könntest



  • Funktionieren tuts wohl?

    Mit der Erklaerung mach ich mich hier bestimmt unbeliebt (C++- Forum!, 'tschuldigung an alle)

    sprintf ist ne Standardfunktion von C.

    Legt in Str (Das ist ein char- Buffer) das Formatierte Ergebnis aus Wert ab.

    Wert ist der zu 'konvertierende Zahlenwert.

    Der mittlere Parameter - "%Lf" - ist der Formatstring. Der legt fest, wie Wert zu interpretieren ist.
    -- f ist float
    -- lf ist 'long float' = double
    -- Lf ist long double

    In C++ wird's auch was geben. Aber ich mach C oder CBuilder.



  • hilft das?

    #include <string>
    #include <iostream>
    using namespace std;
    
    const string i64tostr(const unsigned __int64 & n)
    {
        string ergebnis;
        do
        {
            ergebnis.insert( 0, n % 10 + '0' );
            n /= 10;
        }while(n);
        return ergebnis;
    }
    
    int main()
    {
        unsigned __int64 foo = 0xFFFFFFFFFFFFFFFF;
        cout << i64tostr( foo ) << endl;
        return 0;
    }
    

    oder das hier http://cplus.kompf.de/artikel/gmp.html ?

    [ Dieser Beitrag wurde am 17.03.2003 um 23:25 Uhr von Dimah editiert. ]



  • danke!



  • @ Dimah

    Hi, nur interessenhalber:

    Gibts in Eurer C++ String- Klasse auch was fuer long double?

    Falls Zahlen noch groesser werden.



  • wie meinst du das?



  • Original erstellt von <len0X>:
    in der doku hab ich jetzt gefunden dass es "unsigned long" auch gibt was ich immer mit unsigned long int verwechselt habe, in die aber auch nur die größe bis zu 4294967295 reinpasst...da muss es doch noch eine andere möglichkeit geben...ich will zwar jetzt keinen taschenrechner machen, aber taschenrechner können sowas ja auch

    #usigned long und unsigned long int sind dasselbe.



  • das gmp sieht ja abartig aus. such dir lieber eine klasse. init & clear, wo leben wir denn!
    und das ganze gerede um int64 und long double und so ist sinnlos. floating points sind nicht genau genug und int64 kann nicht annaehernd 64^8 darstellen.



  • Nur ne Frage .... wieso passt 64^8 nicht in nen Float oder double ?

    float = -3.4E38 < x < +3.4E38
    Da passt es imho locker rein 🙂
    nur ned ganz so genau .... auf 6-7 Stellen

    Das ist ja der witz der Flieskommazahlen 🙂

    Ich hoffe das verwirrt jetzt ned allzusehr ...

    ciao ...


Log in to reply