bigfloat
-
hallo leute
ich schreibe grad eine klasse für grosse kommazahlen
was braucht man alles für operationen dafür?
habe bis jetzt folgende:
addieren subtrahieren multiplizieren dividieren links shiften -> << rechts shiften -> >> potenzieren -> pow wurzel ziehen quadratwurzel ziehen quadrieren exponent erhöhen/verkleinern die üblichen vergleichsoperationen < > == != <= >=ich denke ein modulo passt auch noch
was fehlt noch?
oder was würdet ihr hinzufügen
-
meinst du "rationale Zahl mit beliebiger Genauigkeit", wenn du "große Kommazahl" sagst ?
was ist denn << und >> bei einer Kommazahl ? und "modulo" ?
Logarithmus fiele mir noch spontan ein.
-
quasi float bzw double nur halt genauer basierend auf string basis
ok, also die shifts kann ich in den wind schiessen...
hab mich auch die ganze zeit gefragt wie ich das machen soll
letztendlich hab ichs als teilen/multiplizieren mit 2^x geschriebennaja modulo würde den nachkomma teil zurückgeben (frac oder so heisst das doch glaub ich?!?)
von wegen potenz und logarithmus hab ich noch einige probleme, ich weis nnicht ganz wie ich das errechnen soll
aber hab ich noch nicht so ganz 100%ig damit beschäftigt
-
Sinus
Cosinus
Tangens
und deren Umkehrfunktionen
-
mh ok
wobei ich das erst im späteren verlauf implementiere
-
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