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.
Aanbevolen actie
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
waarval
is eenfloat
ofdouble
Vector.ConvertToInt32(Vector<float> val)
(long)val
waarval
is eenfloat
ofdouble
Vector.ConvertToInt64(Vector<double> val)
(uint)val
waarval
is eenfloat
ofdouble
Vector.ConvertToUInt32(Vector<float> val)
(ulong)val
waarval
is eenfloat
ofdouble
Vector.ConvertToUInt64(Vector<double> val)