Welche numerische Typumwandlung ist besser für einfache mathematische Operationen?

8

Ich möchte wissen, welche Konvertierung für eine einfache mathematische Operation besser ist (hinsichtlich Leistung / Geschwindigkeit und Präzision / möglichst wenig Verlust) und was unterscheidet sie?

Beispiel:

%Vor%

Eigentlich geht es bei meiner Frage um die Konvertierung, nicht um den Typ selbst.

    
MagB 09.05.2016, 07:46
quelle

3 Antworten

5

BEARBEITEN

Als Antwort auf Ihre völlig veränderte Frage:

Die erste Zeile double double1 = integer1 / (5 * integer2); hat eine ganzzahlige Division, also tu das nicht.

Auch die Zeile var double8 = Convert.ToDouble(integer1 / (5 * integer2)); führt eine Integer-Division durch, bevor das Ergebnis in ein Double konvertiert wird. Tun Sie das auch nicht.

Abgesehen davon rufen die verschiedenen Ansätze, die Sie auflisten, die IL-Anweisung Conv.R8 einmal für jede Zeile in Ihrem Beispielcode auf.

Der einzige wirkliche Unterschied ist, dass Convert.ToDouble() einen Methodenaufruf macht, um dies zu tun, also sollten Sie das vermeiden.

Die Ergebnisse für jede andere Zeile als double1 und double8 sind identisch.

Sie sollten also wahrscheinlich die einfachste Variante verwenden: var double2 = integer1 / (5.0 * integer2);

In einer komplizierteren Situation sollten Sie Ihren Code überprüfen, um festzustellen, ob es Unterschiede gibt.

    
Matthew Watson 09.05.2016, 08:17
quelle
2

Bei den Unterschieden zwischen Ihren Codezeilen handelt es sich nicht um Konvertierungen, einige von ihnen sind völlig unterschiedliche Dinge und die Werte sind nicht die gleichen.

%Vor%

5 * interger2 gibt eine int , int dividiert int gibt eine int , und Sie weisen den Wert int einer float -Variable zu, indem Sie die implizite Konvertierung verwenden, weil int eine kleine hat Bereich als float . float float1 = 1 / (5 * 2) , Sie erhalten System.Single 0 als Ergebnis.

%Vor%

5.0 ist im Wesentlichen 5.0d , also der Typ von float2 ist System.Double , var float2 = 1 / (5.0 * 2) Sie erhalten als Ergebnis eine System.Double 0.1.

%Vor%

Wenn Sie dieselben Werte oben verwenden, erhalten Sie System.Single 0.1, was wahrscheinlich das ist, was Sie wollen.

%Vor%

Sie erhalten dasselbe wie Punkt 3. Der Unterschied ist, dass item3 int divides by float ist, während item4 float divides by int ist.

%Vor%

Die drei sind fast gleich wie Punkt 3, es berechnet ein int divides by float , nur verschiedene Möglichkeiten, den Teiler zu bauen.

%Vor%

Die beiden geben Ihnen System.Decimal -Werte, die eine höhere Genauigkeit haben. Item8 hat das gleiche Problem wie Item1, Sie erhalten 0, weil der Parameter von Convert.ToDecimal ein int 0 ist.

    
Danny Chen 09.05.2016 08:26
quelle
1

Anstelle von float / decimal doppel:

Eine allgemeinere Antwort für die generische Frage "Dezimal vs Doppelt": Dezimal für monetäre Berechnungen, um die Genauigkeit zu erhalten, Doppelt für wissenschaftliche Berechnungen, die nicht von kleinen Unterschieden beeinflusst werden. Da Double ein Typ ist, der nativ für die CPU ist (die interne Repräsentation ist in der Basis 2 gespeichert), sind Berechnungen mit Double besser als Dezimal (was intern in der Basis 10 dargestellt wird).

    
sumngh 09.05.2016 08:05
quelle