Bei einem XNA-Spiel verwende ich Float für die meisten meiner Zahlenwerte. Die meisten C# -Funktionen scheinen Ein-/Ausgabe-Double zu sein, also schreibe ich viel (float). Soll ich nur Doubles verwenden oder arbeite ich OK?Casting (float) überall in C#. Ist es besser, nur im Doppel zu arbeiten?
Antwort
Sie sollten Doppelbetten verwenden. Sie sind genauer als Schwimmer mit einfacher Präzision, und es wird einen Überhang zum Gießen geben.
Guter Rat im Allgemeinen, aber XNA selbst neigt dazu, "float" vorzuziehen (siehe z Beispiel, die 'MathHelper' Klasse. Nicht sicher, warum, wahrscheinlich, weil, wenn Sie zillions of numbe kopieren und manipulieren rs (wie Sie vielleicht in einem 3D-Spiel sein könnten), dann könnte der Perf-Unterschied zwischen der Verwendung eines 32-Bit- "Float" statt eines 64-Bit- "Double" signifikant sein. http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper_members.aspx – LukeH
@LukeH - In diesem Fall würde ich mit dem Typ gehen, der am wenigsten Casting führt. Wenn du mehr XNA-Anrufe machst, dann gehe mit float, aber ansonsten mit double. – ChrisF
Es ist gut, mit einer Standardauswahl von int
für Ganzzahlen, double
für Gleitkommazahlen und decimal
für Dezimal-genaue Zahlen zu beginnen. Dann nehmen Sie Änderungen an dieser Wahl entweder als Optimierung (float
nimmt weniger Platz als double
so, wenn Sie eine sehr große Anzahl von ihnen, die eine vernünftige Wahl sein könnte), besser nach außen auferlegte Kriterien oder weil es gewonnen hat 't suffice (dh wenn Sie long
statt int
verwenden müssen).
Wenn Leistung ein Problem ist, müssen Sie messen, ob der kleinere Speicherbedarf die Kosten für die Umwandlungen ausgleicht, dies hängt davon ab, wie viel Sie tun.
Wenn Leistung kein Problem ist, würde ich mit Doppel gehen, um Code sauberer zu machen.
Ich denke, es ist verrückt, dass Java und .NET eine explizite Umwandlung von 'double' in' float' erfordern, aber nicht umgekehrt, da jeder Cast der besten 'doppelten' Darstellung einer numerischen Größe zu einem' float' wird ergibt entweder die beste "float" Darstellung dieser Menge oder liegt innerhalb eines LSB davon. Im Gegensatz dazu ergibt das Ausgeben der besten "Float" -Darstellung einer Größe auf "double" oft ein Ergebnis, das bei weitem nicht die beste "doppelte" Darstellung dieser Menge ist und um Hunderte von Größenordnungen abweichen kann (vergleiche die Effekte von casting ... – supercat
... 3.0E + 38 * 2.0 zu 'float' (vergleicht korrekt größer als float.MaxValue), versus Casting 3.0E + 38f * 2.0f zu' double' (falsches Ergebnis größer als 1.0E + 308 Oder, für einen häufigeren Fall, vergleiche die Korrektheit von 'float f = (float) (1.0/10.0); 'und' double d = 1.0f/10.0f; '. Der frühere Stil der Zuweisung erfordert einen Cast, auch wenn alle diese Zuweisungen im wesentlichen numerisch korrekt sind, der letztere Stil erfordert keine Besetzung, obwohl die meisten dieser Zuweisungen einfach falsch sind – supercat