Langzahlarithmetik



  • Hallo!

    Folgendes:

    Es soll in C++ eine Klasse fuer "Langzahlen" (gebrochene Zahlen!) erstellt werden, da bekanntermassen z.B. der Datentyp double fuer das Rechnen mit hoher Genauigkeit nicht ausreicht.
    Das prinzipielle Vorgehen ist dabei bekannt/gegeben: Der Vorkomma- sowie der Nachkommateil werden getrennt gespeichert:

    - fuer den Vorkomma-Teil soll int bzw. long int genuegen
    - die Nachkommastellen werden in einem int-Feld gespeichert.

    Somit koennen halt gebrochene Zahlen mit "beliebig vielen" Nachkommastellen repraesentiert werden. Nun zum eigentlichen Problem 😉

    Wie sieht der Algorithmus zum Multiplizieren bzw. Addieren zweier solcher Langzahlen aus?

    Wenn es sich ledigliche um ganze Zahlen handeln wuerde, waere das Ganze ja wesentlich einfacher, man koennte ja z.B. einfach den Algorithmus der "Schulmethode" nachstellen.
    Angenommen, die zwei Langzahlen 1.2345 und 5.6789 sollen multipliziert werden. Nun koennte (bzw. muss ich, da ja getrennt gespeichert) man ja zunaechst einfach die Vorkomma-Teile multiplizieren (Ueberlauf abfangen!?) und die Nachkomma-Teile getrennt betrachten. Und genau da liegt das Problem, wie bringe ich dann beides am Ende wieder korrekt zusammen!?

    Offensichtlich ist das schon ein eher "triviales" Problem (wie die Mathematiker so schoen sagen *g*), allerdings stehe ich gerade extrem auf dem Schlauch ... 😢

    Danke fuer Hinweise!
    Gruss.



  • also erstmal sind das keine langzahlen, sondern fließkommazahlen mit sehr hoher genauigkeit. oder mathematisch ausgedrückt dezimalbrüche.

    ich weiß nicht was das mit dem int-feld soll. das macht das ganze nur komplizierter.

    aber ich gebe dir mal einen tipp:

    $ a \cdot b = (V\_a + N\_a) \cdot (V\_b + N\_b) = V\_a \cdot V\_b + V\_a \cdot N\_b + N\_a \cdot V\_b + N\_a \cdot N\_b $\\ $ a $... 1. Zahl\\ $ b $... 2. Zahl\\ $ V_a $... Vorkommastellen der ersten Zahl\\ $ N_a $... Nachkommastellen der ersten Zahl\\

    ich hoffe das hilft dir.



  • Hallo Lars!

    Lars Hupel schrieb:

    also erstmal sind das keine langzahlen, sondern fließkommazahlen mit sehr hoher genauigkeit.

    Nunja, aber immerhin sind es eben "lange" Zahlen. Zumindest sollen laengere Zahlen darstellbar sein, als sie mit den C++-Standardtypen darstellbar sind. Ist aber evtl. eine merkwuerdige Bezeichung, ja 😉

    Lars Hupel schrieb:

    ich weiß nicht was das mit dem int-feld soll. das macht das ganze nur komplizierter.

    Wie koennte man denn stattdessen "beliebig viele" Nachkommastellen speichern? Also z.B. 100 oder 500 Nachkommastellen. Entweder als String oder in einem Feld. Oder sehe ich das falsch?

    Lars Hupel schrieb:

    aber ich gebe dir mal einen tipp:

    Danke, das macht das Vorgehen schon etwas klarer. Fehlt dann halt "nur" noch die Implementierung der Addition 😉

    Danke & Gruss.


Anmelden zum Antworten