2009-11-02 3 views
5

So wissen wir, dass Brüche wie 0,1, nicht genau in Binärbasis dargestellt werden können, die genaue Probleme verursachen (wie hier erwähnt: Formatting doubles for output in C#).Wie geht es mit der Tatsache, dass die meisten Dezimalbrüche nicht genau in Binärzahlen dargestellt werden können?

Und wir wissen, dass wir den Dezimaltyp für eine dezimale Darstellung von Zahlen haben ... aber das Problem ist, viele Mathemethoden, nicht unterstützt dezimalen Typ, also haben wir sie in Doppel konvertieren, die die Zahl ruiniert nochmal.

also was sollen wir tun?

+0

Beachten Sie, dass ** Brüche nur dann unpräzise sind, wenn das Fließkommaformat fester Länge ** verwendet wird. Es gibt nichts, was Sie daran hindert, einen beliebig präzisen Bruch als das wahre Verhältnis zweier Zahlen darzustellen, abgesehen von der Tatsache, dass Sie alle mathematischen Berechnungen manuell durchführen müssen. –

+1

Was sind die Arten von Operationen, auf die Sie verweisen, die für Dezimalstellen nicht verfügbar sind? Könnten Sie bitte etwas ausarbeiten? –

Antwort

7

Für eine umfassende Prüfung der Herausforderungen bei der Durchführung von Gleitkomma-Berechnungen finden Sie in diesem Artikel:

Was jeder Informatiker Über wissen sollten Gleitkommaarithmetik http://docs.sun.com/source/806-3568/ncg_goldberg.html

+3

Sind Sie sicher, dass das spezifisch genug ist? –

+0

Vielen Dank für den Link. –

1

Sie das verschieben könnte Dezimalpunkt, so dass die Zahlen ganz sind, dann 64-Bit-Ganzzahlarithmetik, dann verschiebe es zurück. Dann müssten Sie sich nur um Überlaufprobleme kümmern.

3

so was sollten wir tun?

Wir atmen einfach weiter. Es ist wirklich kein strukturelles Problem. Wir haben eine begrenzte Präzision, aber normalerweise mehr als genug. Sie müssen nur daran denken, die Zahlen zu formatieren/runden.

Das Problem im Snippet findet mit den WriteLine(), nicht in der Berechnung (e):

double x = 6.9 - 10 * 0.69; 
Console.WriteLine("x = {0}", x); 

Wenn Sie ein bestimmtes Problem haben, th post it. Es gibt normalerweise Möglichkeiten, den Verlust der Präzision zu verhindern. Wenn Sie wirklich> = 30 Dezimalstellen benötigen, benötigen Sie eine spezielle Bibliothek.

4

Oh, was sollten wir tun, dass die meisten Dezimalbrüche nicht binär dargestellt werden können? oder können diese binären Brüche nicht in Dezimal dargestellt werden?

oder sogar, dass eine Unendlichkeit (in der Tat eine nicht zählbare Unendlichkeit) von reellen Zahlen in allen Basen nicht genau in irgendeinem computerisierten System dargestellt werden kann?

nichts! Um sich an ein altes Klischee zu erinnern, können Sie sich der Regierungsarbeit annähern ... Tatsächlich können Sie für jede Arbeit nah genug sein ... Der Grad der Genauigkeit, den der Computer erzeugen kann, ist unbegrenzt, er kann einfach nicht unendlich sein (das ist, was würde für eine Reihe Darstellungsschema erforderlich sein, um repräsentieren jeder möglich reelle Zahl)

Sie sehen, für jede Zahl Darstellungsschema können Sie in jedem Computer-Design, kann es nur repräsentieren eine endliche Anzahl von verschiedenen reellen Zahlen mit 100.00% Genauigkeit. Und zwischen jedem benachbarten Paar dieser Zahlen (die mit 100% Genauigkeit dargestellt werden können) gibt es immer eine Unendlichkeit anderer Zahlen, die es nicht mit 100% Genauigkeit darstellen kann.

+0

Gibt es eine zählbare Unendlichkeit? –

+2

Ja, die Anzahl der rationalen Zahlen (Bruchzahlen oder technisch die Zahlen, die als Verhältnis zweier Ganzzahlen ausgedrückt werden können) ist zählbar ... Der Beweis besteht darin, alle Ganzzahlen als Zeilen- und Spaltenüberschriften in einer Tabelle aufzuführen und jede Zelle enthält den Bruch, bei dem es sich um den Spaltenwert dividiert durch den Zeilenwert handelt. Sie "zählen" dann durch diagonale (links unten nach oben rechts) beginnend mit oberen linken Zelle (1/1), dann zweite Diagonale ist 1/2, 2/1, dann dritte Diagonale ist 1/3, 2/2, 3/1, etc .. dieses Verfahren "zählt" effektiv die rationals ... –

+0

Cantor kam dazu (in den 1800er Jahren denke ich) nannte er diese erste Ebene der Unendlichkeit Aleph-Null oder Aleph Null. Die Anzahl der reellen Zahlen (rationals und irrationales wie sqrt (2), ist aleph = Eins, und unzählbar. Er bewies, dass es unendlich viele Ebenen von Unendlichkeiten gibt, obwohl das jenseits meiner Fähigkeit ist, dies in einem Kommentar zu erklären! –

3

Beachten Sie, dass die erforderliche Genauigkeit und die erforderlichen Rundungsregeln von Ihrer Problemdomäne abhängen.

Wenn Sie Software schreiben, um einen Kernreaktor zu steuern, oder um das erste Milliardstel einer Sekunde des Universums nach dem Urknall zu modellieren (mein Freund tat das tatsächlich), benötigen Sie viel höhere Präzision als wenn Sie rechnen Umsatzsteuer (etwas, was ich für einen Lebensunterhalt).

In der Finanzwelt zum Beispiel werden implizit oder explizit bestimmte Anforderungen an die Genauigkeit gestellt. Einige Steuergebiete in den USA legen Steuersätze auf 5 Nachkommastellen fest. Ihr Rundungsschema muss so viel Präzision ermöglichen. Als ein großer Teil Westeuropas zum Euro konvertierte, gab es einen sehr spezifischen Ansatz zum Runden, der ins Gesetz geschrieben wurde. Während dieser Übergangszeit war es wichtig, genau nach Bedarf zu runden.

Kennen Sie die Regeln Ihrer Domäne und testen Sie, ob Ihr Rundungsschema diese Regeln erfüllt.

2

Ich glaube jeder impliziert: Invertieren einer spärlichen Matrix? "Es gibt eine App für das", etc, etc.

Numerische Berechnung ist ein gut ausgepeitscht Pferd. Wenn Sie ein Problem haben, wurde es wahrscheinlich vor 1970 oder noch viel früher auf die Weide gebracht, Bibliothek für Bibliothek oder Schnipsel per Schnipsel in die Zukunft mitgenommen.

1

Und wir wissen, dass wir für eine Dezimaldarstellung Zahlen den Dezimal-Typ haben ... aber das Problem ist, viele von Methoden Math, nicht unterstützt nicht dezimal Typ, also haben wir sie konvertieren zu verdoppeln, was die Nummer wieder ruiniert.

Mehrere der Math methods Unterstützung tun decimal: Abs, Ceiling, Floor, Max, Min, Round, Sign und Truncate. Was diese Funktionen gemeinsam haben, ist, dass sie exakte Ergebnisse liefern. Dies entspricht dem Zweck von decimal: genaue Arithmetik mit Base-10-Nummern zu tun.

Die trig und Exp/Log/Pow Funktionen geben ungefähre Antworten, so würde, was den Punkt Überlastungen des Habens für einen „exakten“ arithmetischen Typ?

Verwandte Themen