Visual Studio 2015 говорит, что «приведение избыточно». Почему?

У меня есть изображение шириной 888 пикселей и высотой 592 пикселя с соотношением сторон ширины: высоты как 3: 2.

Следующее дает неправильное значение 1 из-за целочисленного вычисления/усечения, поскольку BitmapDecoder.PixelWidth и BitmapDecoder.PixelHeight оба являются uint (целое число без знака), а decoder ниже являются объектом BitmapDecoder.

double aspectRatio = decoder.PixelWidth / decoder.PixelHeight;

Следующее дает ожидаемое правильное значение 1,5, но Visual Studio говорит, что «Cast является избыточным», но почему?

double aspectRatio = (double)decoder.PixelWidth / (double)decoder.PixelHeight;


person user2921851    schedule 02.12.2015    source источник
comment
вам нужен только один (двойной) бросок - double / int = double. Или int/double = double.   -  person Dmitriy    schedule 02.12.2015
comment
Результат всегда будет двойным, если вы разделите двойное число на любой числовой тип.   -  person Hjalmar Z    schedule 02.12.2015
comment
double aspectRatio = static_cast<double>(decoder.PixelWidth) / decoder.PixelHeight; должно быть достаточно, чтобы компилятор использовал PixelHeight как двойной.   -  person Pixelchemist    schedule 02.12.2015
comment
Чтобы быть абсолютно точным, я бы хотел, чтобы Visual Studio оставила первое приведение в покое по мере необходимости и только отобразила второе приведение как избыточное. В этом смысле Visual Studio немного вводит в заблуждение, но можно объяснить (или аргументировать), почему.   -  person user2921851    schedule 02.12.2015
comment
Какое это имеет отношение к С++?   -  person sjdowling    schedule 02.12.2015


Ответы (2)


Вам нужно только привести один из uint к удвоению, чтобы принудительно использовать арифметику с плавающей запятой, поэтому:

double aspectRatio = decoder.PixelWidth / (double)decoder.PixelHeight;

or:

double aspectRatio = (double)decoder.PixelWidth / decoder.PixelHeight;

Лично я бы выбрал второе, но это вопрос личного мнения.

person ChrisF    schedule 02.12.2015
comment
Возьми! Одного приведения было бы достаточно, но Visual Studio сбила меня с пути. Я бы хотел, чтобы Visual Studio оставила в покое первое приведение и только отобразила второе приведение как ненужное, чтобы быть абсолютно точным. В этом смысле Visual Studio немного вводит в заблуждение, но можно объяснить, почему. - person user2921851; 02.12.2015

Просто чтобы дополнить ответ @ChrisF, вы можете хорошо видеть это в коде IL, где одно приведение к double приведет к преобразованию для обоих значений:

IL_0013:  stloc.0     // decoder
IL_0014:  ldloc.0     // decoder
IL_0015:  callvirt    UserQuery+Decoder.get_PixelHeight
IL_001A:  conv.r.un   // convert uint to float32
IL_001B:  conv.r8     // convert to float64 (double)
IL_001C:  ldloc.0     // decoder
IL_001D:  callvirt    UserQuery+Decoder.get_PixelWidth
IL_0022:  conv.r.un   // convert uint to float32
IL_0023:  conv.r8     // convert to float64 (double)
person Yuval Itzchakov    schedule 02.12.2015