bigfloat



  • Wer solche extreme Dinge vorhat, kommt um die Schaffung eines eigenen Datentyps bigfloat nicht herum. Ist aber mehr als eine blosse Übungsaufgabe! Floats sind intern float=mantisse*pow(2,Exponent). Das entscheidende ist die Mantisse, die auf 2 (oder mehr) Werte aufgeteilt werden muss. Kann mir vorstellen, dass es sowas schon gibt.



  • achja geben tuts schon alles

    es gibt auch schon computerspiele, trotzdem werden neue gemacht, mit neuen engines und sonstwas...

    mh, eigendlich wollte ich meinen geheimen (miesen, schlecht gemachten) welteroberungs plan für bigfloat private halten...

    also ich habe eine klasse für ganze zahlen (bigunsigned) aus dieser wird eine klasse für integers gemacht (bigint erbt von bigunsigned)
    und ich benutze diese für mein projekt

    ich mache das ganze so (ich weis es geht besser, viel besser, also bitte psst):
    - mantisse -> bigint
    - exp -> int reicht denke ich
    - basis -> 10

    dann stehen da so sachen wie 67543685643(mantisse), -5 (exp), 10(basis) drinne
    und raus kommt 67543.685643

    nach dem schema

    ich hab das ganze vorhher nicht geplant, nicht designed, nicht auf dem papier nach gedacht, alles spontan aus langeweile und zur übung...

    es geht ein ganzes stück besser das ist mir klar



  • Skym0sh0 schrieb:

    es geht ein ganzes stück besser das ist mir klar

    echt? kommt ganz drauf an, was man will. eigentlich ist nur die basis 10 bedenklich. alles andere finde ich klasse.
    ich denke, die basis 10 ist an sich eine gute idee, weil du dir die konvertierung beim einlesen und ausgeben sparst. aber hätst du von 10000 als basis? einlesen und ausgeben sind fast genauso unproblematisch wie zuvor. und die multiplikation (in der schrecklichen annahme, daß du die karatsuba-multiplikation noch nicht drin hast) ist 16-mal so schnell. 😋



  • Skym0sh0 schrieb:

    bigint erbt von bigunsigned

    nee. wirklich nicht. ganz und gar nicht.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-75672-and-highlight-is-bebel.html



  • volkard schrieb:

    das ist ein sehr kleines problem:
    http://www.ellrich-net.de/Pispigot.htm

    Autsch, die Implementierung 😮



  • volkard schrieb:

    Skym0sh0 schrieb:

    bigint erbt von bigunsigned

    nee. wirklich nicht. ganz und gar nicht.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-75672-and-highlight-is-bebel.html

    ich hab das bigunsigned und bigint zeugs nicht geschrieben 😉
    das hab ich wo runter geladen
    und der herr hat das so gemacht dass big int von bigUINT erbt...

    naja ist ja auch egal



  • Skym0sh0 schrieb:

    und der herr hat das so gemacht dass big int von bigUINT erbt...

    Wäre dann ein ähnliches Problem wie ein iterator , der von einem const_iterator erbt (hatte ich gerade erst). Die Funktionalität der Basisklasse wird zwar durch die Vererbung erweitert, aber die IST-EIN-Beziehung ist nicht mehr gegeben.

    volkard, hast du gerade dein nettes Geschichtlein zur Hand? 😉



  • Nexus schrieb:

    volkard, hast du gerade dein nettes Geschichtlein zur Hand? 😉

    3 Posts über deinem. 😉

    Auf einen noch silbrigeren Tablett wirst du es nicht bekommen. 😉



  • drakon schrieb:

    3 Posts über deinem. 😉

    Auf einen noch silbrigeren Tablett wirst du es nicht bekommen. 😉

    Argh, ich hab den Link gar nicht beachtet. Ich dachte, das wäre ein sonstiger Exkurs zum Thema... 😉



  • ich hab hier folgenden code

    string s = "001.00";
    string::iterator i = s.begin();
    while ( *i == '0' && *(i+1) != '.' )
    {
    	s.erase(i);
    }
    
    i = s.end()-1;
    while ( *i == '0' && *(i-1) != '.' )
    {
    	s.erase(i);
    }
    

    am ende soll eigendlich nur noch 1.0 im string stehen
    aber der löscht mit der zweiten schleife nur die letzte null und beim zweiten durchlauf bricht die schleife mit einer fehlermeldung ab, von wegen string iterator nicht dereferenzierbar...

    im ersten durchlauf ist der iterator *i noch "0" aber im zweiten sollte er theoretisch immer noch "0" sein oder?

    wo liegt mein denkfehler?

    edit:

    // ...
    while ( *i == '0' && *(i-1) != '.' )
    {
    	s.erase(i);
            --i;
    }
    

    mh der iterator wird ja s.end(), und end zeigt ja hinter den string...
    hatte das erst, aber auch oben, und weils in der erstens chleife falsch war hab ichs auch direkt in der zweiten mit weggemacht



  • Sehr richtig erkannt, der Exponent ist sicher kein Problem, nur die Mantisse. Welche Basis (2,10,16) man nimmt, ist schon des Nachdenkes wert. Also, wenn Du das schon selbst machen willst, dann doch gleich mit einem Datentyp "hugefloat" für vielleicht 200 gültige Stellen für die Zahl pi. Damit kann man möglicherweise eine Eintragung bei "Guiness World Records" erreichen? Oder man merkt, dass so etwas niemand ermsthaft braucht. Bedenke auch, dass auch noch die Operatoren << und >> der Streamklassen von C++ überladen werden sollten. Ich wünsche Dir viel Spass bei Deinem Vorhaben. Ich hätte dafür keine Verwendung - mir reicht der Standard.



  • off-topic:

    mit 200 Nachkommastellen von pi kommt man heute leider nicht mehr ins Guiness Buch - selbst als Kopfrechner muß man dazu heute schon über 100.000 Stellen memorieren können 😞

    Der derzeitige Rekord mit Computer-Hilfe liegt bei über 1.200.000.000.000 Stellen 😮


Anmelden zum Antworten