Frage

Alle Methoden in System.math nimmt double als Parameter und gibt Parameter zurück. Die Konstanten sind auch vom Typ double. Ich habe ausgecheckt Mathnet.numerics, und das gleiche scheint dort der Fall zu sein.

Warum ist das? Besonders für Konstanten. Nicht decimal Soll genau sein? Wäre das bei Berechnungen nicht oft nützlich?

War es hilfreich?

Lösung

Dies ist ein klassischer Speed-gegen-Icuracy-Kompromiss.

Denken Sie jedoch daran, dass für PI beispielsweise die meisten Ziffern, die Sie jemals brauchen werden, 41 sind.

Die größte Anzahl von PI -Ziffern, die Sie jemals benötigen werden, ist 41. Um den Umfang des Universums mit einem Fehler weniger als dem Durchmesser eines Protons zu berechnen, benötigen Sie 41 Ziffern PI †. Es scheint sicher zu schließen, dass 41 Ziffern in PI eine ausreichende Genauigkeit für jedes Kreismessungsproblem sind, auf das Sie wahrscheinlich begegnen. So haben in den im Jahr 2002 berechneten PI -Ziffern von über den 41. in den im Jahr 2002 berechneten PI keinen praktischen Wert.

Darüber hinaus haben Dezimal und doppelt eine etwas andere interne Speicherstruktur. Dezimalstellen sind so konzipiert, dass sie Basis 10 -Daten speichern, wobei als Doppel (und Schwimmer) binäre Daten aufbewahrt werden. Auf einer binären Maschine (wie jeder existierende Computer) hat ein Double weniger verschwendete Teile, wenn sie eine beliebige Anzahl innerhalb seines Bereichs speichert.

Überlegen Sie auch:

System.Double      8 bytes    Approximately ±5.0e-324 to ±1.7e308 with 15 or 16 significant figures
System.Decimal    12 bytes    Approximately ±1.0e-28 to ±7.9e28 with 28 or 29 significant figures

Wie Sie sehen können, hat Decimal einen kleineren Bereich, aber eine höhere Präzision.

Andere Tipps

Nein, - Dezimalstellen sind nicht exakter als verdoppelt oder irgendeiner Art. Das Konzept von "Genauigkeit", (wenn man über numerische Darstellungen in einem Compuiter spricht) ist das, was falsch ist. Jeder Typ ist absolut 100% genau bei der Darstellung etwas Zahlen. Unsignierte Bytes sind zu 100% exakt, um die gesamten Zahlen von 0 bis 255 zu repräsentieren. Sie sind jedoch nicht gut für Brüche oder Negative oder Ganzzahlen außerhalb des Bereichs.

Dezimalstellen sind zu 100% genau bei der Darstellung eines bestimmten Satzes von genau Basis 10 Werte. verdoppelt (da sie ihren Wert verwenden binär IEEE Exponential Repräsentation) sind genau die Darstellung eines Satzes von binär Zahlen. Auch beides ist nicht genauer als im Allgemeinen, sondern auch für verschiedene Zwecke.

Ein bisschen weiter auszuarbeiten, da ich für einige Leser nicht klar genug zu sein scheint ...

Wenn Sie jede Zahl einnehmen, die als Dezimalheit dargestellt werden kann, und jeden von ihnen auf einer Zahlenlinie zu markieren, dazwischen jeder benachbarter Paar von ihnen gibt es zusätzliche Unendlichkeit von realen Zahlen, die sind nicht als Dezimalzahl dargestellt. Die genaue Aussage kann über die Zahlen gemacht werden, die als Doppel dargestellt werden können. Wenn Sie jede Dezimalzahl auf der Nummernlinie in Blau markieren und mit Ausnahme der Ganzzahlen jedes Doppel in Rot markieren, würden nur sehr wenige Stellen in beiden Farben gekennzeichnet. Im Allgemeinen ist das Blue -Set (Dezimalstellen) für 99,99999 % der Markierungen (bitte nicht in meinem Prozentsatz angeben).

Dies liegt daran, dass es nach unserer Definition für das blaue Set eine Basis 10 -Mantissa/Exponent -Darstellung ist und ein Doppel -Basis 2 Mantissa/Exponent -Darstellung ist. Jeder Wert, der als Basis 2 Mantissa und Exponent dargestellt wird, (1.00110101001 x 2 ^ (-11101001101001) bedeutet den Mantissa -Wert (1.00110101001) und multiplizieren Sie es mit 2 an die Macht des Exponents erhöht (wenn Exponent negativ ist, ist dies eindeutig, um durch 2 auf die Leistung des Absolutwerts des Exponenten zu teilen). Dies bedeutet, dass der Exponent negativ ist (oder wenn ein Teil der Mantissa eine fraktionale Binärin ist), die Zahl nicht als Dezimalmantissa und Exponent dargestellt werden kann und umgekehrt.

Für jede willkürliche reelle Zahl, die zufällig auf die reale Zahlenlinie fällt, liegt es entweder näher an einem der blauen Dezimalstellen oder an einem der roten Doppel.

Decimal ist präziser, hat aber weniger Reichweite. Sie würden in der Regel doppelt für Physik und mathematische Berechnungen verwenden, aber Sie würden Dezimal für finanzielle und monetäre Berechnungen verwenden.

Einzelheiten finden Sie in den folgenden Artikeln zu MSDN.

Doppelthttp://msdn.microsoft.com/en-us/library/678hzkk9.aspx

Dezimalhttp://msdn.microsoft.com/en-us/library/364x0z75.aspx

Es scheint, als ob die meisten Argumente hier "es nicht tut, was ich will" sind ", aber es ist schneller", nun, ist die Ansi C+GMP -Bibliothek, aber niemand befürwortet das richtig?

Wenn Sie besonders die Genauigkeit kontrollieren möchten, gibt es andere Sprachen, die sich die Zeit genommen haben, genaue Präzision auf benutzersteuerbare Weise zu implementieren:

http://www.doughellmann.com/pymotw/decimal/

Wenn Ihnen die Präzision wirklich wichtig ist, dann sind Sie wahrscheinlich besser mit Sprachen, die Mathematiker verwenden würden. Wenn Sie Forran nicht mögen, ist Python eine moderne Alternative.

Unabhängig davon, in welcher Sprache Sie arbeiten, denken Sie an die goldene Regel: Vermeiden Sie Mischtypen ... Konvertieren Sie also A und B, um gleich zu sein, bevor Sie einen Operator B versuchen

Wenn ich eine Vermutung erraten würde, würde ich sagen, dass diese Funktionen eine mathematische Funktionen auf niedriger Ebene nutzen (vielleicht in C), die Dezimalstellen nicht intern verwendet, und dass eine Dezimalzahl eine Besetzung von Doppel nach Dezimalheit erfordern würde. Außerdem besteht der Zweck des Dezimalwerttyps darin, die Genauigkeit zu gewährleisten. diese Funktionen nicht und kann nicht Rückgabe 100% genaue Ergebnisse ohne unendliche Präzision (z. B. irrationale Zahlen).

Weder dezimal noch schweben oder doppelt sind gut genug, wenn Sie etwas benötigen, um präzise zu sein. Darüber hinaus ist Dezimalal so teuer und überbeanspruchte da draußen, dass es zu einem regelmäßigen Witz wird.

Wenn Sie in Brüchen arbeiten und ultimative Präzision benötigen, verwenden Sie Brüche. Es ist die gleiche alte Regel, konvertieren Sie einmal und nur bei Bedarf. Auch Ihre Rundungsregeln variieren je nach App, Domain usw., aber Sie können ein oder zwei seltsame Beispiele finden, in denen es geeignet ist. Wenn Sie jedoch Fraktionen und ultimative Präzision wünschen, besteht die Antwort nicht, etwas als Brüche zu verwenden. Bedenken Sie, dass Sie möglicherweise auch eine Funktion der willkürlichen Präzision wünschen.

Das tatsächliche Problem mit CLR im Allgemeinen ist, dass es so seltsam und schlicht gebrochen ist, eine Bibliothek zu implementieren, die sich mit Numerikern auf generische Weise befasst, hauptsächlich aufgrund eines schlechten primitiven Designs und dem Mangel des beliebtesten Compilers der Plattform. Es ist fast genauso wie bei Java -Fiasko.

Das Doppelte ist nur der beste Kompromiss, der die meisten Domänen abdeckt, und es funktioniert gut, obwohl MS JIT immer noch nicht in der Lage ist, eine CPU -Technologie zu verwenden, die jetzt etwa 15 Jahre alt ist.

Stück an Benutzer von MSDN -Ablauf -Compilern

Double ist ein eingebauter Typ. IS wird von FPU/SSE -Kern (früher als "Math Coprozessor" bekannt) unterstützt, deshalb ist es wahllos schnell. Vor allem bei Multiplikation und wissenschaftlichen Funktionen.

Decimal ist eigentlich eine komplexe Struktur, die aus mehreren Ganzzahlen besteht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top