在C#中到处浇铸(浮动)。只打双打更好吗?
在XNA游戏中,我对大多数数值都使用浮点。大多数C#函数的输入/输出都是双倍的,所以我经常写(float)。我应该使用双打还是我的工作方式可以?你应该使用双打。它们比单精度浮点更精确,并且会有一个强制转换的开销。对于整数,最好从默认的在C#中到处浇铸(浮动)。只打双打更好吗?,c#,casting,floating-point,double,C#,Casting,Floating Point,Double,在XNA游戏中,我对大多数数值都使用浮点。大多数C#函数的输入/输出都是双倍的,所以我经常写(float)。我应该使用双打还是我的工作方式可以?你应该使用双打。它们比单精度浮点更精确,并且会有一个强制转换的开销。对于整数,最好从默认的int开始,对于浮点数,double和十进制精确数,decimal开始。然后对该选择进行更改,或者作为优化(float占用的空间小于double,因此如果您存储了大量的数据,这可能是一个合理的选择),以便更好地匹配一些外部强加的标准,或者因为它不足以满足要求(即,当
int
开始,对于浮点数,double
和十进制精确数,decimal
开始。然后对该选择进行更改,或者作为优化(float
占用的空间小于double
,因此如果您存储了大量的数据,这可能是一个合理的选择),以便更好地匹配一些外部强加的标准,或者因为它不足以满足要求(即,当您需要使用long
而不是int
)时。如果性能是一个问题,您必须衡量较小的内存占用是否补偿了强制转换的成本,这将取决于您正在进行的强制转换的数量
如果性能不是一个问题,我会选择double以使代码更干净。一般来说,这是一个好建议,但XNA本身倾向于使用
float
(例如,请参见MathHelper
类)。不确定原因,可能是因为如果您正在复制和操纵大量数字(就像在3D游戏中一样)那么,使用32位的浮点数
而不是64位的双精度
之间的性能差异可能会很大。@LukeH-在这种情况下,我会选择导致最少强制转换的类型。如果要进行更多的XNA调用,那么就使用浮点数,否则就使用双精度。我认为Java和.NET需要显式的cast从double
到float
但不是相反,因为将数值量的最佳double
表示转换为float
将产生该量的最佳float
表示,或者在该量的一个LSB之内。相反,将最佳float
表示转换为将一个数量表示为double
通常会产生与该数量的最佳double
表示相去甚远的结果,并且可能会偏离数百个数量级(将铸造效果……3.0E+38*2.0与float
(正确地比较大于float.MaxValue),与将3.0E+38f*2.0f转换为double
(错误地比较大于1.0E+308)。或者,对于更常见的情况,比较float f=(float)(1.0/10.0)的正确性;
和双d=1.0f/10.0f;
。前一种类型的赋值需要强制转换,即使所有此类赋值在数字上基本正确。后一种类型不需要强制转换,即使大多数此类赋值都是完全错误的。