Warum basiert System.Math und beispielsweise MathNet.Numerics auf Double?

7

Alle Methoden in System.Math nehmen double als Parameter und gibt zurück Parameter. Die Konstanten haben ebenfalls den Typ double . Ich habe MathNet.Numerics ausgecheckt, und das scheint auch so zu sein.

Warum ist das? Speziell für Konstanten. Soll decimal nicht genauer sein? Wäre das nicht oft nützlich für Berechnungen?

    
Svish 05.11.2009, 14:28
quelle

7 Antworten

16

Dies ist ein klassischer Kompromiß zwischen Geschwindigkeit und Genauigkeit.

Beachten Sie jedoch, dass für PI zum Beispiel die meisten Ziffern 41 sind.

  

Die größte Anzahl von Ziffern von pi   dass du jemals brauchen wirst, ist 41. To   Berechnen Sie den Umfang der   Universum mit einem Fehler kleiner als der   Durchmesser eines Protons brauchst du 41   Ziffern von Pi †. Es scheint sicher zu sein   folge, dass 41 Ziffern ausreichen   Genauigkeit in Pi für jeden Kreis   Vermessungsproblem, das Sie wahrscheinlich haben   Begegnung. Also, in der über eins   Billionen Ziffern von Pi berechnet in   2002 haben alle Ziffern jenseits des 41. haben   kein praktischer Wert.

Darüber hinaus haben dezimal und double eine etwas andere interne Speicherstruktur. Dezimale dienen zum Speichern von Basis-10-Daten, wobei Doppelwerte (und Gleitkommazahlen) Binärdaten enthalten. Auf einer binären Maschine (wie jeder existierende Computer) hat ein Double weniger verschwendet Bits, wenn eine Zahl in seinem Bereich gespeichert wird.

Bedenke auch:

%Vor%

Wie Sie sehen können, hat dezimal einen kleineren Bereich, aber eine höhere Genauigkeit.

    
John Gietzen 05.11.2009, 14:31
quelle
4

Nein, - Dezimalstellen sind nicht mehr "genau" als doppelt, oder für jeden Typ. Das Konzept der " Genauigkeit " (wenn man von numerischen Darstellungen in einem Computer spricht) ist falsch. Jeder Typ ist absolut 100% genau bei der Darstellung von einigen Zahlen. Vorzeichenlose Bytes sind 100% genau und repräsentieren die ganzen Zahlen von 0 bis 255. Aber sie sind nicht gut für Brüche oder für negative oder ganze Zahlen außerhalb des Bereichs.

Dezimalstellen sind zu 100% genau, wenn sie eine bestimmte Menge von Basis 10 -Werten darstellen. doubles (da sie ihren Wert mithilfe der binären IEEE-Exponentialdarstellung speichern) stellen genau eine Menge von binären Zahlen dar . Keiner ist genauer als der andere im Allgemeinen, sie dienen einfach verschiedenen Zwecken.

Um ein bisschen weiter zu arbeiten, da ich für einige Leser nicht klar genug zu sein scheint ...

Wenn Sie jede Zahl nehmen, die als Dezimalzahl darstellbar ist, und jede davon in einer Zahlenzeile markieren, gibt es zwischen jedem benachbarten Paar eine weitere Unendlichkeit von reellen Zahlen, die nicht als Dezimalzahl darstellen können. Die genau gleiche Aussage kann über die Zahlen gemacht werden, die als ein Doppel dargestellt werden können. Wenn Sie jede Dezimalstelle auf der Zahlenlinie in Blau und jedes Doppel in Rot mit Ausnahme der Ganzzahlen markieren, gibt es nur sehr wenige Stellen, an denen in beiden Farben der gleiche Wert markiert ist. Im Allgemeinen, für 99,99999% der Markierungen, (bitte nicht meinen Prozentsatz pitchen) ist die blaue Menge (Dezimalzahlen) eine völlig andere Anzahl von Zahlen als die rote Menge (die Doppel).

Dies liegt daran, dass wir nach unserer Definition für die blaue Menge eine Basis-10-Mantissen / Exponent-Repräsentation und eine Doppelbasis eine Basis-2-Mantissen / Exponenten-Repräsentation darstellen. Jeder Wert repräsentiert als Basis 2 Mantisse und Exponent, (1.00110101001 x 2 ^ (-11101001101001) bedeutet, nehmen Sie den Mantissenwert ( 1.00110101001 ) und multiplizieren ihn mit 2 erhöht auf die Potenz des Exponenten (wenn der Exponent negativ ist, entspricht dies der Division durch 2 zur Potenz des absoluten Wertes des Exponenten). Dies bedeutet, dass, wenn der Exponent negativ ist (oder wo irgendein Teil der Mantisse eine gebrochene binäre Zahl ist), die Zahl nicht als eine Dezimal-Mantisse und ein Exponent dargestellt werden kann, und umgekehrt.

Für jede beliebige reelle Zahl, die zufällig auf die reelle Zahl fällt, ist sie entweder näher an einer der blauen Dezimalzahlen oder an einem der roten Doppelpunkte.

    
Charles Bretana 05.11.2009 14:37
quelle
3

Dezimal ist genauer, hat aber weniger Reichweite. Normalerweise würden Sie Double für physikalische und mathematische Berechnungen verwenden, aber Sie würden Decimal für finanzielle und monetäre Berechnungen verwenden.

Siehe die folgenden Artikel auf msdn für Details.

Doppelt Ссылка

Dezimal Ссылка

    
Robin Day 05.11.2009 14:34
quelle
1

Scheint so, als ob die meisten Argumente hier "Es tut nicht, was ich will" sind "aber es ist schneller", so gut ist ANSI C + Gmp-Bibliothek, aber niemand befürwortet das richtig?

Wenn Sie vor allem die Genauigkeit kontrollieren möchten, gibt es andere Sprachen, die sich die Zeit genommen haben, die exakte Genauigkeit auf benutzerfreundliche Weise zu implementieren:

Ссылка

Wenn Präzision für Sie wirklich wichtig ist, dann sind Sie wahrscheinlich besser dran, Sprachen zu verwenden, die Mathematiker verwenden würden. Wenn Sie Fortran nicht mögen, dann ist Python eine moderne Alternative.

Egal in welcher Sprache du arbeitest, erinnere dich an die goldene Regel:  Vermeide Typen zu mischen ...  Konvertieren Sie also a und b, bevor Sie einen Operator b

versuchen     
Gary 28.01.2011 11:38
quelle
0

Wenn ich eine Schätzung riskieren würde, würde ich sagen, dass diese Funktionen mathematische Funktionen auf niedriger Ebene (vielleicht in C) nutzen, die intern keine Dezimalen verwenden, und daher würde das Zurückgeben einer Dezimalzahl eine Umwandlung von doppelt in dezimal erfordern. Der Zweck des Dezimalwerttyps besteht außerdem darin, Genauigkeit sicherzustellen; diese Funktionen nicht und können nicht 100% genaue Ergebnisse ohne unendliche Genauigkeit (z. B. irrationale Zahlen) zurückgeben.

    
Dan Tao 05.11.2009 14:36
quelle
0

Weder Dezimal noch Float oder Double sind gut genug, wenn Sie etwas benötigen, um genau zu sein. Außerdem ist Decimal so teuer und überstrapaziert, dass es zu einem normalen Witz wird.

Wenn Sie in Fraktionen arbeiten und höchste Präzision erfordern, verwenden Sie Fraktionen. Es ist dieselbe alte Regel, konvertiere einmal und nur wenn nötig. Auch Ihre Rundungsregeln variieren je nach App, Domain usw., aber Sie können sicher ein oder zwei Beispiele dafür finden, wo es passt. Aber wenn Sie Brüche und höchste Präzision wünschen, ist die Antwort, nichts anderes als Brüche zu verwenden. Stellen Sie sich vor, Sie möchten möglicherweise auch eine Funktion mit beliebiger Genauigkeit.

Das eigentliche Problem mit CLR im Allgemeinen ist, dass es so seltsam und einfach gebrochen ist, eine Bibliothek zu implementieren, die sich mit Zahlen in generischer Art beschäftigt, hauptsächlich wegen schlechtem primitiven Design und Mangel des populärsten Compilers für die Plattform. Es ist fast dasselbe wie mit Java Fiasko.

double erweist sich als der beste Kompromiss, der die meisten Domains 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 für Benutzer von MSDN-Verlangsamungscompilern]

    
rama-jka toti 05.11.2009 15:58
quelle
0

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

Dezimal ist eigentlich eine komplexe Struktur, bestehend aus mehreren ganzen Zahlen.

    
yk4ever 05.11.2009 17:41
quelle

Tags und Links