Ich möchte meine eigene Variable "type" als Hausaufgabe in C ++ schreiben. Es sollte ein beliebig langer Float sein. Ich dachte an Struktur wie ...
Wo, wenn ich eine Nummer wie: 3.1415 habe Vorher = '3'; nach = '1415'; pos = 1; Wenn das für Sie Sinn macht ... ABER Zuweisung will, dass ich etwas Speicher speichere, was ich nicht mache, weil für jede Nummer, die ich über sie zitiere, ungefähr 1 Byte ist, was zu viel ist, denke ich.
Wie würden Sie diese beliebig langen Zahlen darstellen? (Sorry für mein schlechtes Englisch, ich hoffe der Beitrag macht Sinn)
Wenn Sie Speicher bewahren müssen, bedeutet das, dass Sie den Speicher so effizient wie möglich nutzen müssen. Mit anderen Worten, angesichts des Werts, den Sie speichern, sollten Sie keine Bytes verschwenden.
Beispiel:
Ich denke, dein Vektor von Zeichen ist in Ordnung. Wenn Sie einen C ++ 11-Compiler verwenden dürfen, würde ich das wahrscheinlich in einen Vektor von uint8_t <ändern / a> und stellen Sie sicher, wenn ich den Wert speichern, dass ich einen Wert von 0 bis 255 in einem Vektor der Größe 1 speichern kann.
Aber das ist nicht das Ende davon. Aus den Geräuschen folgt, was Sie suchen, ist eine beliebige Anzahl von signifikanten Ziffern. Für eine echte Float-Repräsentation müssen Sie jedoch Speicherplatz für die Basis und den Exponenten zuweisen, nachdem Sie entschieden haben, was die Basis sein soll Sei für deinen Typ. Es stellt sich auch die Frage, ob der Exponent auch beliebig lang sein soll. Nehmen wir an.
Also würde ich wahrscheinlich so etwas für Mitglieder Ihrer Klasse verwenden:
%Vor%Es kommt dann darauf an, die verschiedenen Operatoren für Ihren Typ zu implementieren und verschiedene Szenarien zu testen, um sicherzustellen, dass Ihre Lösung funktioniert.
Wenn Sie wirklich gründlich sein möchten, können Sie ein einfaches Testframework verwenden, um sicherzustellen, dass Probleme, die Sie auf dem Weg beheben, bleiben Sie fest.
Im Speicher wird es im Wesentlichen wie eine binäre Darstellung der Zahl aussehen.
%Vor%Wie bereits erwähnt, benötigen Sie nicht unbedingt zwei Vektoren für vor und nach dem Komma. Allerdings verwende ich zwei in meiner Antwort, weil es das Verständnis erleichtert und Sie nicht die Nachkommastellen verfolgen müssen. Die Speicheranforderungen von zwei gegen einen Vektor sind wirklich nicht so unterschiedlich, wenn Sie mit einer langen Folge von Ziffern arbeiten.
Ich sollte auch beachten, dass die Verwendung einer Ganzzahl zum Aufzeichnen der Position des Dezimalpunkts die Anzahl der Ziffern auf 2 Milliarden begrenzt, was keine beliebig lange Zahl ist.
UPDATE: Wenn das tatsächlich Hausaufgaben sind, würde ich mit denen, die Ihnen die Hausaufgaben gegeben haben, nachfragen, ob Sie Gleitkomma-Sonderfälle unterstützen müssen, die einfachste wäre NaNs . Es gibt andere Spezialfälle , aber der Versuch, alle zu implementieren, wird dies sehr schnell von einer Hausaufgabe in eine verwandeln eine These. Viel Glück:)
Verwenden Sie nicht zwei separate Vektoren before
und after
. Sie benötigen ganze Mantissen, um arithmetische Operationen auszuführen.
Tatsächlich ist Ihr pos
ein Exponent. Benenne es entsprechend. Exponent ist übrigens signiert.
Sie brauchen Zeichen der Mantisse.
Ich empfehle, Mantisse als rationalen Bruch zu speichern. Sie benötigen zwei Zahlen: Zähler und Nenner. Dann können Sie Division ohne Abrundung machen.
Es ist besser, Zahlen als Ints mit beliebiger Länge anstelle von Zahlenfeldern zu speichern.
PS. Ich habe diesen Rechner schon lange gemacht. Um meine Antwort zu illustrieren, gebe ich dir eine Klassenerklärung für die Nummer:
%Vor%Ich habe MFC benutzt. CString ist eine Standardzeichenfolge.
Tags und Links c++