bigfloat



  • Ich glaube, er erreicht die zusätzliche Genauigkeit dadurch, dass er die Zahl in einem String speichert (also mehr Stellen). Ein String ist meiner Ansicht nach aber nicht gerade der optimalste Ansatz...



  • Nexus schrieb:

    Skym0sh0 schrieb:

    die normalen operationen (+ - * /) hab ich als memberfunktionen implementiert und die dazugehörigen operatoren ausserhalb der klasse dazu

    Also du meinst schon += etc. als Member und + etc. global?

    += *= ... sind als member implementiert und + - * / sind global

    Nexus schrieb:

    Skym0sh0 schrieb:

    vergleichs methode habe ich auch, auf diese greifen dann die global überladenen operatoren zu (< > >= == ...)

    Hm, brauchst du die Vergleichsmethoden überhaupt, wenn du die Operatoren hast?

    ich greife in der operator definition auf die verlgeichs methode zu
    so muss ich die datenkapselung nicht per friend umgehen

    Nexus schrieb:

    Ich glaube, er erreicht die zusätzliche Genauigkeit dadurch, dass er die Zahl in einem String speichert (also mehr Stellen). Ein String ist meiner Ansicht nach aber nicht gerade der optimalste Ansatz...

    jop, per string...
    ich probier erstmal nur was rum, ich hab sonst keine richtige aufgabe (als 17 jähriger ;))



  • Skym0sh0 schrieb:

    ich probier erstmal nur was rum, ich hab sonst keine richtige aufgabe (als 17 jähriger ;))

    Ja, solche Sachen können manchmal ganz spannend sein. Vielleicht kannst du dich bei Gelegenheit auch an einer Bruch-Klasse versuchen, hab ich auch mal gemacht... 😉



  • ich auch, ist aber schon länger her 😉



  • mh

    ich hab bei der eingabe jetzt es so gemacht dass alle zeichen die nicht gültig sind (also buchstaben und sonderzeichen) einfach ignoriert werden und aus dem string gekickt werden

    wenn aber nur ein buchstabe zum beispiel eingeben wurde, was soll ich dann machen?
    per exit das programm abbrechen, eine exception werfen, die zahl auf 0 setzen?



  • mach's wie beim int.



  • failbit setzen?

    mh geht schlecht glaub ich

    ich hab einen Ctor der einen string bekommt und den dann so bearbeitet dass man bequem und gut meine zahl rausbekommt (sprich alle falschen zeichen löscht, 2. komma löscht und sowas alles)

    mh wie würde ich das denn setzen können?



  • Skym0sh0 schrieb:

    ich hab einen Ctor der einen string bekommt

    oh.
    exception ist am saubersten.
    zahl auf 0 setzen geht zur not auch.
    buchstaben ignorieren läßt fehler unerkannt und ist böse.
    exit ist am verbotensten.



  • mit ignorieren meine ich dass der buchstabe gelöscht wird, also nicht in den finalen sauberen string kommt



  • Was ist bei Dir eine "grosse Gleitkommazahl"? Der Datentyp long double bietet je nach Compiler 60 oder mehr bit und reicht für mindestens 17 signifikante Stellen. Wenn dies genügt, braucht man keine eigene Klasse, C/C++ macht dann alles und hält geeigenete Funktionen bereit. Wer braucht schon mehr als 17 signifikante Stellen?



  • es ist eine gute übung wie ich finde...

    ausserdem, rechne mal mit standart c++ mitteln die 100ste stelle von pi aus...

    aber dass man grosse zahlen mit standart c++ mitteln errechnen kann, das wäre mir neu

    BCD ist extern, boost auch, was anderes fällt mir nicht wirklich ein, aber es sind alles externe bibliotheken nix internes

    ok, denke ich werfe eine exception (ob der user die fängt ist ihm überlassen) und setze die zahl auf 0



  • Skym0sh0 schrieb:

    es ist eine gute übung wie ich finde...

    finde ich auch.
    aber ich würde nur ne klasse für natürliche zahlen machen. aus der dann eine für ganze machen und dann vielleicht fließkommazahlen. innendrin gerechnet wird aber nur auf ganzen zahlen. vielleicht. hab's noch nicht gemacht, bin nicht sicher.

    Skym0sh0 schrieb:

    ausserdem, rechne mal mit stan**** c++ mitteln die 100ste stelle von pi aus...

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

    [/quote]ok, denke ich werfe eine exception (ob der user die fängt ist ihm überlassen) und setze die zahl auf 0[/quote]
    ja, mach das.
    aber wundere dich nicht über die warnung des compilers, daß er den code unterhalb von throw nicht ausführen will. 🤡



  • 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. 😉


Anmelden zum Antworten