Delen via


Conversies van zwevende komma-naar-gehele getallen zijn verzadiging

Conversies van drijvende komma-naar-gehele getallen hebben nu een verzadigingsgedrag op x86- en x64-machines. Verzadigingsgedrag betekent dat als de geconverteerde waarde te klein of groot is voor het doeltype, de waarde is ingesteld op respectievelijk de minimum- of maximumwaarde voor dat type.

Vorig gedrag

In de volgende tabel ziet u het vorige gedrag bij het converteren van een float of double meer waarden.

Converteren naar ... Waarde van x (Vorige) resultaat
int scalaire en verpakte int.MinValue <= x <= int.MaxValue (int)x
< int.MinValue of > int.MaxValue int.MinValue
long scalaire en verpakte long.MinValue <= x <= long.MaxValue (long)x
< long.MinValue of > long.MaxValue long.MinValue
uint scalaire en verpakte Alle waarden (((long)x << 32) >> 32)
ulong scalaire en verpakte <= 2^63 (long)x
> 2^63 (long)(x - 2^63) + 2^63

Nieuw gedrag

In de volgende tabel ziet u het nieuwe gedrag bij het converteren van een float of double meer waarden.

Converteren naar ... Waarde van x .NET 9+ resultaat
int scalaire en verpakte int.MinValue <= x <= int.MaxValue (int)x
< int.MinValue int.MinValue
> int.MaxValue int.MaxValue
NaN 0
long scalaire en verpakte long.MinValue <= x <= long.MaxValue (long)x
< long.MinValue long.MinValue
> long.MaxValue long.MaxValue
NaN 0
uint scalaire en verpakte 0 <= x <= uint.MaxValue (uint)x
x > uint.MaxValue uint.MaxValue
x < 0 0
ulong scalaire en verpakte 0 <= x <= ulong.MaxValue (ulong)x
x > ulong.MaxValue ulong.MaxValue
x < 0 0

Versie geïntroduceerd

.NET 9 Preview 4

Type wijziging die fouten veroorzaken

Deze wijziging is een gedragswijziging.

Reden voor wijziging

Deze wijziging is aangebracht om alle conversies van drijvende komma-naar-gehele getallen te standaardiseren om verzadigingsgedrag te hebben en om het gedrag deterministisch te maken.

Als u afhankelijk bent van de waarden die worden weergegeven in de sectie Vorig gedrag die moeten worden geretourneerd door de conversie, zelfs als deze onjuist waren, werkt u de code bij om de waarden te verwachten die worden weergegeven in de sectie Nieuw gedrag .

Als de prestatieoverhead van het nieuwe gedrag ongewenst is voor uw scenario, kunt u in plaats daarvan de nieuwe ConvertToIntegerNative<TInteger> methoden gebruiken voor Single, Double en Half , die snel zijn. In de meeste gevallen komt het gedrag van deze methoden overeen met het vorige drijvende-naar-geheel getal-conversiegedrag. Deze methoden hebben echter platformspecifiek gedrag dat niet gegarandeerd overeenkomt met het vorige conversiegedrag (dat al niet-deterministisch was). In plaats daarvan doen deze methoden wat het meest efficiënt is voor het systeemeigen platform. Het resultaat wordt met name niet gegarandeerd voor waarden die buiten het vertegenwoordigbare bereik van het TInteger type vallen.

In het zeldzame geval dat u prestaties nodig hebt en een strikte garantie voor het overeenkomen van het vorige conversiegedrag, kunt u de platformspecifieke hardware-intrinsieken gebruiken. U kunt bijvoorbeeld Sse.ConvertToInt32(Vector128.CreateScalar(val)) gebruiken om te verwerken (int)val voor float. U moet controleren if (Sse.IsSupported) voordat u deze gebruikt. Het gebruik van deze intrinsieke kenmerken is echter lastig, omdat andere doelplatforms (zoals Arm64) al verschillende resultaten opleveren.

Betrokken API's

Alle expliciete en impliciete casts van drijvende komma naar geheel getal:

  • (int)val waar val is een float of double
  • Vector.ConvertToInt32(Vector<float> val)
  • (long)val waar val is een float of double
  • Vector.ConvertToInt64(Vector<double> val)
  • (uint)val waar val is een float of double
  • Vector.ConvertToUInt32(Vector<float> val)
  • (ulong)val waar val is een float of double
  • Vector.ConvertToUInt64(Vector<double> val)