使用f后缀表示数字文字

时间:2011-01-19 21:31:30

标签: c# .net compiler-construction math

我看到一些像这样的代码:

float num2 = ( ( this.X * this.X ) + ( this.Y * this.Y ) ) + ( this.Z * this.Z );
float num = 1f / ( ( float ) Math.Sqrt ( ( double ) num2 ) );
this.X *= num;
this.Y *= num;
this.Z *= num;

这是否重要?:

float num2 = ( ( this.X * this.X ) + ( this.Y * this.Y ) ) + ( this.Z * this.Z );
float num = 1 / ( ( float ) Math.Sqrt ( ( double ) num2 ) );
this.X *= num;
this.Y *= num;
this.Z *= num;

编译器是否会使用(float) / (float)或尝试将(double) / (float)用于第2行的第二个示例?

编辑:顺便说一下会有任何性能差异吗?

2 个答案:

答案 0 :(得分:6)

它实际上使用(int)/(float)作为第二个例子。由于Int32可以隐式转换为Single,编译器不会抱怨,它会正常工作。

话虽如此,如果你这样做,它会抱怨:

float num = 1.0 / ( ( float ) Math.Sqrt ( ( double ) num2 ) );

这会导致它尝试使用(double)/(float),这将有效地变成(double)/(double)。然后编译器会在尝试将double隐式设置为float变量时抱怨。


  编辑:顺便说一下会有任何性能差异吗?

可能不是一个可衡量的。话虽这么说,你将在IL中创建额外的转换操作。这些可能在JIT期间被淘汰 - 但同样,它将是微观的。

就个人而言,我可能会使用双精度数学来处理它,因为它会使代码更容易阅读:

double num2 = (this.X * this.X) + (this.Y * this.Y) + (this.Z * this.Z);
float num = (float) (1.0 / Math.Sqrt(num2));
this.X *= num;
// ...

答案 1 :(得分:1)

没有;它会是一样的。

如果您将1f更改为1.0(或1d),则结果为double