2015-12-02 10 views
5

Mam obraz o szerokości 888 pikseli i wysokości 592 pikseli, o współczynniku kształtu: wysokość jako 3: 2.Program Visual Studio 2015 twierdzi, że "rzut jest zbędny". Czemu?

następuje powoduje błędną wartość 1, ze względu na całkowitą obliczania/obcinania BitmapDecoder.PixelWidth i BitmapDecoder.PixelHeight oba uint (liczba całkowita bez znaku) i decoder poniżej będący przedmiotem BitmapDecoder.

double aspectRatio = decoder.PixelWidth/decoder.PixelHeight;

Poniżej przedstawiono oczekiwaną poprawną wartość 1.5, ale Visual Studio mówi 'Cast jest zbędny', ale dlaczego?

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

+1

trzeba tylko jeden (podwójny) Cast - double/int = double. Lub int/double = double. – Dmitriy

+0

Wynik zawsze będzie podwójny, jeśli podzielisz podwójne z dowolnym typem liczbowym. –

+0

'double aspectRatio = static_cast (decoder.PixelWidth)/decoder.PixelHeight;' powinien wystarczyć, aby kompilator używał 'PixelHeight' jako podwójnego. – Pixelchemist

Odpowiedz

12

Wystarczy tylko rzucić jeden z uints podwoić zmusić arytmetyce zmiennoprzecinkowej więc albo:

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

czyli

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

Osobiście Idziemy z tym ostatnim, ale to kwestia opinii.

+1

Pobierz! Wystarczyłaby jedna obsada, ale Visual Studio zniechęciło mnie do tego. Chciałbym, aby Visual Studio pozostawił pierwszą obsadę i sprawił, że druga obsada była niepotrzebna, aby była absolutnie dokładna. W tym sensie Visual Studio jest nieco mylące, ale można to wyjaśnić. – user2921851

2

Wystarczy uzupełnić @ odpowiedź ChrisF, można zobaczyć to ładnie w kodzie IL, gdzie pojedyncza obsada do double przyniesie konwersję dla obu wartości:

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) 
Powiązane problemy