bigfloat
-
Bei den arithmetischen Operatoren kannst du gerade noch die Zuweisungs-Versionen schreiben, also
+=,-=,*=,/=(je nachdem auch=). Dekrement- und Inkrementoperatoren wirst du wahrscheinlich eher nicht brauchen.Was vielleicht noch praktisch wäre, sind Überladungen der Stream-Operatoren
<<und>>, damit man diese mitstd::istreamundstd::ostreamverwenden kann.
-
ein und ausgabe habe ich noch nicht geschrieben aber vor...
die normalen operationen (+ - * /) hab ich als memberfunktionen implementiert und die dazugehörigen operatoren ausserhalb der klasse dazuich hab konstruktoren für die normalen build in typen und string und copy Ctor, vergleichs methode habe ich auch, auf diese greifen dann die global überladenen operatoren zu (< > >= == ...)
-
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?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?
-
Skym0sh0 schrieb:
quasi float bzw double nur halt genauer basierend auf string basis
Da float und double integrierte Datentypen und keine Klassen sind würde es mich doch interessieren was Du mit "nur halt genauer meinst"? Vermeidung von Rundgsfehler oder größere Anzahl an Vorkomma- bzw. Nachkommastellen?
Rationale Zahlen mit großer Genauigkeit sind nicht ganz einfach, aber gut als Klasse zu implementieren. Gleiches gilt für BCD-Zahlen. Spannend ist auch das decfloat Thema: http://www.c-plusplus.net/forum/viewtopic-var-t-is-229658-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html
Schreib mal etwas mehr zu Deiner Aufgabenstellung...
-
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 umgehenNexus 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 projektich mache das ganze so (ich weis es geht besser, viel besser, also bitte psst):
- mantisse -> bigint
- exp -> int reicht denke ich
- basis -> 10dann stehen da so sachen wie 67543685643(mantisse), -5 (exp), 10(basis) drinne
und raus kommt 67543.685643nach 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