bigfloat
-
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
-
volkard schrieb:
das ist ein sehr kleines problem:
http://www.ellrich-net.de/Pispigot.htmAutsch, 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.htmlich 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 einemconst_iteratorerbt (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
