[C#] rationale Zahlen

Dshing

Lt. Commander
Registriert
Nov. 2007
Beiträge
1.436
Hi, ich brauche mal wieder eure Hilfe.
Wie kann ich in C# denn mit rationalen zahlen rechnen? Ich finde nur hunderte von ganzzahligen Variablentypen. Aber wie heißen denn die für rationale Zahlen oder reelle Zahlen?
 
Ich denke das ist eines der fälle wo man sich nen eigenen datentyp schreiben muss.
 
Meinst du wirklich rationale Zahlen? Wenn du ganz normale Fließkommazahlen meinst dann ist "float" oder "double" gut ... wenn es sich um Geld handelt dann nimm "decimal".
 
Hi,

schau mal hier:
http://de.wikibooks.org/wiki/C++-Programmierung/_Brüche
http://dotnet-snippets.de/dns/bruch-klasse-SID1259.aspx

Du solltest aber wissen, dass du bei Standard-Programmiersprachen nicht jeden Bruch exakt darstellen kannst. Durch die Einschränkungen bei den Gleitkommazahlen (die ja im Binärsystem als bits und bytes abgebildet werden) ist es nicht möglich sämtliche Brüche mit ihrem tatsächlichen exakten Wert darzustellen.
Aus diesem Grund gibt es wohl dafür auch keine vordefinierte Standard-Klasse.

Grüße,
Tom
 
Man kann natürlich argumentieren das man nicht alle reele zahlen, genauer gesagt die irrationale zahlen (R\Q), gar nicht in einem computer speichern kann.

In vielen fällen reicht ein double oder auch ein unsigned double aus. Sollte dir die präzision nicht ausreichen, wie es tatsächlich mal vorkommen könnte, musst du dir einen eigenen datentypen schreiben. Genauso wenn du einen datentyp haben möchtest, der z.B. nur! rationale zahlen speichert. Wenn du hingegen einfach nen datentypen brauchst, welcher auch nicht natürliche zahlen speichern kann, reicht dir float bzw double locker aus.
 
Baue dir eine entsprechende Datenstruktur. In C wäre das soetwas wie
Code:
struct ratnum {
    unsigned int numer, denom;
    int sign:1;
};

Das lässt sich sicher auch sinnlos zu einer Klasse aufblasen. Mit überladenen Operatoren und was man
sich nicht alles für OOP-Grausamkeiten ausdenken kann. Deiner Fantasie sind keine Grenzen gesetzt.

€: Selbstverständlich findet man im besten denkbaren Buch und Kurs zum Einstieg in die Programmierung
(Ich rede natürlich von SICP) nicht nur alles zum Rechnen mit speziellen Datenstrukturen für rationale
Zahlen, sondern gleich auch Polynome und imaginäre Zahlen und wie man mit ein paar einfachen Handgriffen
mit allen durcheinander beliebig rechnen kann. Komplett abstrahiert, ohne dass der Benutzer irgendetwas
von den internen Abläufen mitbekommt.

Ein Polynom, deren Koeffizienten Brüche aus imaginären Zahlen sind? SICP sagt dir, wie. Und hinterher ist
man nur verblüfft wie einfach das jetzt war. Kann doch gar nicht sein, denkt man. Mind = Blown.

Erwähnte ich, wie großartig SICP ist? Nein? Ok. SICP hat meinen Horizont -- selbst nachdem ich jahrelang
programmiert habe -- enorm erweitert. Jeder, der sich mit dem Fach beschäftigt, sollte es lesen. Und es kostet
nicht einmal was. Und für Lesefaule gibt es den Kurs sogar als Videovorlesungen. Was will man mehr?

€2:Meine Struktur verschönert und ich sollte euch noch was ausrichten:
[01:31:05] <XXX> asdman: kannst du da mal hart auf den tisch kacken?
[01:31:07] <XXX> decimal für geld?
[01:31:16] <XXX> sind die banane?
[01:32:01] <XXX> decimal ist immer noch ieee754 fp
[01:32:04] <XXX> und damit fuer geld nicht geeignet
 
Zuletzt bearbeitet:
@asdfman: schreibst du das decimal für Geldbeträge Banane ist? Hab ich nicht ganz rausgelesen was du meinst - also lesen wir mal nach was die MSDN dazu sagt:

http://msdn.microsoft.com/en-us/library/364x0z75(v=vs.80).aspx

Und der Text der gleich ganz oben im Text vorkommt:

The decimal keyword denotes a 128-bit data type. Compared to floating-point types, the decimal type has a greater precision and a smaller range, which makes it suitable for financial and monetary calculations.
 
bepi74: Das war ich nicht, sondern ein Mensch aus dem IRC. Ich selbst habe zu der Sache keine Meinung.

€: Es kam noch eine Ergänzung aus dem IRC. Ich gebe die jetzt so wieder, wie ich sie bekommen habe.
Meckert mich bitte nicht an, wenn euch die Meinung nicht passt.

[14:44:16] <XXX> asdfman: du kannst antworten:
[14:45:20] <XXX> geldbeträge sind fixed-point, d.h. 2 nachkommastellen, während decimal eben fp ist
[14:45:33] <XXX> und dann haust du da noch den folgenden link dazu:
[14:46:01] <XXX> http://citeseer.ist.psu.edu/viewdoc...5D4EF9E2?doi=10.1.1.102.244&rep=rep1&type=pdf
 
Zuletzt bearbeitet:
Zurück
Oben