Doppeltgenaue Integerzahlen < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 13:49 Mi 07.02.2007 | Autor: | skalar |
Aufgabe | Addition, Subtraktion, Multiplikation von "doppeltgenauen Integerzahlen"
Bereich: +- 10^18 - 1
KEIN 64bit-ganz zahlen typ... maximal 32bit |
hallo allerseits,
da mir beim letzten mal schon so super geholfen wurde, dacht ich mir veruch ichs diesmal nochmal :)
diesmal geht es um informatik. vorher sei gesagt, das ich wirklich die Ambition habe die Hausarbeit selber zu programmieren und keinerlei Lösungen haben möchte sondern nur bissel Hilfe und Denkanstöße :)
da ich schon früher als C64-besitzer programmiert habe (natürlich nur basic...für assembler hats net gereicht;) ) finde ich meine aufgabe garnet schwer.. eeeiiigentlich
die Aufgabenstellung wie oben.
nunja... eigentlich nur ein Taschenrechner
doch was genau habe ich unter "doppeltgenauen Integerzahlen" zu verstehen?
und.. wie soll ich den wertebereich abdecken ohne einen 64bit-typ zu verwenden? ein 32bit-typ geht doch nur bis [mm] 10^9
[/mm]
so...das wärs für erste...
achja..dazu sei gesagt... ich muss erst am 15.3 abgeben ;)
mfg
|
|
|
|
Hallo,
in welcher Programmiersprache sollst du das bewerkstelligen?
> doch was genau habe ich unter "doppeltgenauen Integerzahlen" zu verstehen?
Hmm, das ist keine offizielle Bezeichnung. Aber die Antwort gibst du ja selbst mit dem darzustellenden Bereich, oder? Ansonsten solltest du vielleicht nochmal nachfragen, was der Aufgabensteller damit meint.
> und.. wie soll ich den wertebereich abdecken ohne einen 64bit-typ zu verwenden?
Das geht nicht, es sei denn, du machst Abstriche bei der Genauigkeit. Jeder Taschenrechner zeigt immer nur eine fest Anzahl von Stellen an und rechnet intern auch nur mit einer bestimmten Genauigkeit.
Daher wäre es möglich, ganze Zahlen analog zu floats darzustellen mit Vorzeichen, Exponent (ohne Bias, weil wir nur ganze Zahlen darstellen wollen) und Basiszahl, wobei man z.B. folgendes Format wählen könnte:
Vorzeichen s: 1 bit
Exponent e: 5 bit
Basiszahl b: 26 Bit
Die darzustellende Zahl wäre dann (anders als bei floats!) $x = [mm] (-1)^s [/mm] * [mm] 2^e [/mm] * b$
Das ist nur als Anregung gedacht, falls ich die Aufgabe richtig verstanden habe.
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:23 Mi 07.02.2007 | Autor: | skalar |
hallo,
oh..vergessen.... soll in C++ gecodet werden
ich werde dem Prof einfach mal ne mail schreiben.. meld mich dann mit seiner antwort
da ich erst im ersten semester bin weiß ich leider auch net wie er sich das da vorstellt... ein ungenauer taschenrechner (sei es auch nur in fernen dezimalbereich) is doch irgendwie auch net das wahre ;)
danke
mfg
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 08:31 Do 08.02.2007 | Autor: | Frank05 |
> Addition, Subtraktion, Multiplikation von "doppeltgenauen
> Integerzahlen"
>
> Bereich: +- 10^18 - 1
> KEIN 64bit-ganz zahlen typ... maximal 32bit
> diesmal geht es um informatik. vorher sei gesagt, das ich
> wirklich die Ambition habe die Hausarbeit selber zu
> programmieren und keinerlei Lösungen haben möchte sondern
> nur bissel Hilfe und Denkanstöße :)
> und.. wie soll ich den wertebereich abdecken ohne einen
> 64bit-typ zu verwenden? ein 32bit-typ geht doch nur bis
> [mm]10^9[/mm]
Hast du dir schonmal überlegt wie man früher mit 16bit Integern diese tollen großen Zahlen dargestellt hat, die heute ganz lässig in einem 32bit Integer Platz finden? Oder was ist mit noch viel größeren Zahlen, wie etwa Primzahlen in versch. Verschlüsselungsverfahren?
Offensichtlich sind 32bit zu wenig für eine solche Zahl. Wenn du nun also einen Datentyp hättest der 64bit lange Zahlen speichert wäre das Problem gelöst. Warum also nicht einfach einen solchen Datentyp selber schreiben? Um die 64bit zu bekommen kannst du einfach zwei 32bit Integer nehmen und sie als einen 64bit Integer auffassen, d.h. der zweite Integer speichert Werte die um Faktor 2^32 größer sind.
Auf diese Weise lassen sich beliebig große Zahlen darstellen (natürlich begrenzt durch die Speicherkapazität), aber für diese Art von Datentyp musst du dann leider selbst die nötigen Eingabe/Ausgaberoutinen schreiben, da eine normale Ausgabe von zwei 32bit Integern hier nicht wirklich hilfreich ist.
PS: Es gibt übrigens auch einige Bibliotheken für C++, die derartige erweiterte Datentypen zur Verfügung stellen. Schlagwort zum Suchen: BigInt(eger)
PPS: Das ist natürlich nur eine Möglichkeit, aber die Grundidee bleibt immer die Gleiche: Verwende vorhandene Datentypen um daraus einen neuen größeren Datentyp zusammenzusetzen.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:44 Do 08.02.2007 | Autor: | Martin243 |
Hallo,
das ist natürlich eine Möglichkeit, aber ich dachte, man soll sich wirklich auf einen int pro darzustellende Zahl beschränken. Falls nicht, stehen einem natürlich alle Türen offen...
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:10 Fr 09.03.2007 | Autor: | skalar |
hier die antwort vom prof:
----------------
Ganz einfach: wenn Sie ein System haben, das als einen zusätzlichen Typ eine
64-Bit-Ganzzahl zur
Verfügung hat (solche Systeme gibt es!), wäre die Aufgabe viel zu einfach.
Nein, Sie sollen den Bereich bis 10^18 imitieren,
beispielsweise, dass Sie eine 64-Bit-Darstellung auf zwei (natürlich nicht:
EINE)
32-Bit-Darstellungen herunterbrechen, dann arbeiten Sie in der
Binärdarstellung
- oder dass Sie in einen Speicherplatz den Bereich bis
[mm] 10^9 [/mm] (unterste 9 Dezimalziffern) und in den anderen die oberen Dezimalziffer
abspeichern (dann arbeiten
Sie von der Hochsprache her in der Dezimaldarstellung). Im letztern Fall
wäre die Zahl dann wertmäßig
darzustellen - NICHT in C++ so zu berechnen, da Bereichsüberschreitung:
Zahl1 + [mm] Zahl2*10^9,
[/mm]
---------------
bissel spät .. ich weiß... aber hatte bis gestern noch einen klausurblock zu beweltigen .)
mfg
|
|
|
|