Использование суффикса f для числовых литералов - PullRequest
3 голосов
/ 20 января 2011

Я вижу такой код:

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;

Имеет ли значение, если это так?

1005

Будет ли компилятор использовать (float) / (float) или попытаться использовать (double) / (float) для второго примера для строки 2?

РЕДАКТИРОВАТЬ: Кстати будет ли разница в производительности?

Ответы [ 2 ]

6 голосов
/ 20 января 2011

На самом деле используется (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;
// ...
1 голос
/ 20 января 2011

Нет; было бы то же самое.

Если изменить 1f на 1.0 (или 1d), результат будет double.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...