2010-11-24 2 views
5

Travaillant sur un jeu XNA, j'utilise float pour la plupart de mes valeurs numériques. La plupart des fonctions C# semblent entrer/sortir des doubles donc j'écris beaucoup (float). Devrais-je simplement utiliser Double ou est-ce que je travaille bien?Coulée (float) partout en C#. Vaut-il mieux travailler en double?

+0

Je pense qu'il est fou que Java et .NET ont besoin d'un casting explicite de '' double' à float' mais non l'inverse, puisque tous les acteurs de la meilleure représentation 'double' d'une quantité numérique à un' float' sera donner soit la meilleure représentation 'float' de cette quantité, soit se trouver à l'intérieur d'une LSB. En revanche, le fait de donner la meilleure représentation 'float' d'une quantité' 'double'' produira souvent un résultat qui est loin de représenter la meilleure représentation' 'double'' de cette quantité, et pourrait être décalé de centaines d'ordres de grandeur (comparer les effets de coulée ... – supercat

+0

... 3.0E + 38 * 2.0 à 'float' (compare correctement supérieur à float.MaxValue), par opposition à coulée 3.0E + 38f * 2.0f à' double' (compare incorrectement plus de 1.0E + 308 Pour un cas plus courant, comparez l'exactitude de 'float f = (float) (1.0/10.0);' et 'double d = 1.0f/10.0f; même si toutes ces assignations seront essentiellement numériquement correctes, ce dernier style n'exige pas de distribution, même si la plupart de ces assignations sont carrément fausses – supercat

Répondre

2

Vous devriez utiliser des doubles. Ils sont plus précis que les flotteurs de précision simple et il y aura un frais généraux pour le moulage.

+1

Bon conseil en général, mais XNA lui-même a tendance à préférer "float" (voir, pour exemple, la classe 'MathHelper'). Vous ne savez pas pourquoi, probablement parce que si vous copiez et manipulez des zillions de numbe rs (comme vous pourriez l'être dans un jeu en 3D) alors la différence de perf entre l'utilisation d'un 'float' de 32 bits plutôt que d'un' double 'de 64 bits pourrait être significative. http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper_members.aspx – LukeH

+2

@LukeH - Dans ce cas, j'irais avec le type qui se traduit par le moins de casting. Si vous faites plus d'appels XNA, alors allez avec float, mais sinon allez avec le double. – ChrisF

2

Il est bon de commencer avec un choix par défaut de int pour les entiers, double pour les nombres à virgule flottante et decimal pour les nombres à précision décimale. Modifiez ensuite ce choix en tant qu'optimisation (float prend moins de place que double, donc si vous en conservez un très grand nombre, cela pourrait être un choix raisonnable), pour mieux correspondre à certains critères imposés à l'extérieur, ou parce qu'il a gagné n'est pas suffisant (c'est-à-dire lorsque vous devez utiliser long au lieu de int).

1

Si la performance est une question que vous devrez mesurer si l'empreinte mémoire plus petite compense le coût des moulages, cela dépendra de combien casting que vous faites.

Si la performance est pas un problème je vais avec le double pour faire plus propre code.