На самом деле используется (int)/(float)
для второго примера.Поскольку Int32 неявно конвертируется в Single, компилятор не будет жаловаться, и он будет работать нормально.
При этом он будет жаловаться, если вы выполните:
float num = 1.0 / ( ( float ) Math.Sqrt ( ( double ) num2 ) );
Это может привести кэто попытка использовать (double)/(float)
, которая фактически превратится в (double)/(double)
.Затем компилятор будет жаловаться, когда этот double попытается неявно установить в переменную с плавающей точкой.
РЕДАКТИРОВАТЬ: Кстати, будет ли разница в производительности?Вероятно, не измеримый.При этом вы будете создавать дополнительные операции преобразования в 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;
// ...