Addition, Subtraktion von "hochgenauen Integerzahlen"
-
long double darf ich nicht benutzen und sitze jetzt schon zwei tage vorm intet und dem compiler und mir fällt beim besten willen nichts ein.
hab auch schon über ein array nachgedacht, weiß aber nicht genau wie ich das realisieren soll.(gibts nicht eine einfachere lösung?)
-
hast du vielleichtr schon irgendeinen ansatz?
-
die eigentliche fkt. ist ja kein problem, aber ich bekomm den wertebereich nicht hin
-
Darfst du irgendwelche Bibliotheken benutzen? Oder zumindest die Standardbibliothek?
Ansonsten: Ein naiver Ansatz wäre, jeweils für einen gewissen Potenzbereich eine Variable anzulegen (oder als Teil eines Arrays). Besser wäre eine binäre Repräsentation, schau doch mal hier.
-
Du könnest einfach den größten Datentyp nehmen, den
du nehmen darfst ich denke das dürfte long sein und
dann zerhackst du deine Zahl in longs und rechnest
damit und anschließend klebst du sie wieder zusammen
(wenn ich Mist rede: einfach ignorieren :D)MfG Jonas

-
Speicher die Zahlen einfach als BCD - also ein char pro Ziffer. Addition und Subtraktion damit wirst Du ja wohl hinkriegen.
-
Belli schrieb:
Speicher die Zahlen einfach als BCD - also ein char pro Ziffer. Addition und Subtraktion damit wirst Du ja wohl hinkriegen.
und nem bool für das vorzeichen....

-
unskilled schrieb:
und nem bool für das vorzeichen....

Ist nicht mal nötig. Du kannst einer der char-Werte (meistens einer am Anfang oder Ender der Liste) dazu verwenden, dass Vorzeichen zu speichern. Ihn also positiv oder negativ zu machen. Hat seine Vor- und Nachteile.
Neben BCD gibt es übrigens noch die Möglichkeit, dass du ein Integer Typ nimmst. Dann sagst du einfach, dass das Komma an der Stelle x ist. Addition und Subtraktion ist kein Problem, nur bei der Division und Multiplikation müsstest du aufpassen.
Und was du natürlich machen muss, ist eine eigene Ein- und Ausgabe für diesen Datentyp. Aber besten erledigst du das alles über eine entsprechende Klasse.Grüssli
-
Dravere schrieb:
Du kannst einer der char-Werte (meistens einer am Anfang oder Ender der Liste) dazu verwenden, dass Vorzeichen zu speichern. Ihn also positiv oder negativ zu machen. Hat seine Vor- und Nachteile.
Ich finde, dass es eher Nachteile biete, als Vorteile

Neben BCD gibt es übrigens noch die Möglichkeit, dass du ein Integer Typ nimmst. Dann sagst du einfach, dass das Komma an der Stelle x ist...
Ich weiß ja nicht, mit welchem Integer du 60 Stellen speichern kannst - mein Compiler kennt den leider nicht ;P
bb
-
Für 9 Stellen braucht man 4 Oktetts, für 60 sind es dann 28. Wenn man beim BCD mit einem Oktett pro Dezimalstelle arbeitet, reduziert man also den Platzbedarf etwa auf die Hälfte. Außerdem kann man dann häufiger statt software- die Hardware-algorithmen für die Arithmetik einbinden (viele Platformen unterstützen keine BCD-Arithmetik in Hardware).
-
Man lerne die Zweierkomplementdarstellung, packe die ganzen Bits in einen String und schreibe eine Funkion die zwei dieser Strings addiert.
Da es bei dir offensichtlich nicht auf Performance ankommt, kann man das ganze ruhig mit einem String basteln
Wahlweise natürlich auch bool[] oder was-auch-immer 
-
PS: man kann das natürlich auch mit Dezimalzahlen machen, aber bei Binärcodierung lernt man wenigstens gleich etwas über CPUs und wie sie funzen

-
unskilled schrieb:
Ich finde, dass es eher Nachteile biete, als Vorteile

Der Meinung bin ich eigentlich auch, habe aber nun schon von mehreren Leuten gehört, welche fanden, dass dies mehr Vorteile biete.
Irgendwann will ich es auch noch ohne bool probieren, vielleicht haben sie ja recht und ich sehe es aktuell nur nicht ...unskilled schrieb:
Ich weiß ja nicht, mit welchem Integer du 60 Stellen speichern kannst - mein Compiler kennt den leider nicht ;P
Ups, habe das 60 übersehen

Naja, dann müsste man wohl schon, wie talas geschrieben hat, vorgehen. Man teilt die Zahl auf mehrere Integer Zahlen auf. So lange man nur Addition und Subtraktion benötigt, dürfte dies keine grossen Problem verursachen. Man muss nur ein wenig mit std::numeric_limits herumhantieren, um die Over- und Underflows abzufangen.Grüssli