Aracılığıyla paylaş


Kayan noktadan tamsayıya dönüştürmeler doygunlukta

Kayan noktadan tamsayıya dönüştürmeler artık x86 ve x64 makinelerinde doygunluk davranışına sahip. Doygunluk davranışı, dönüştürülen değerin hedef tür için çok küçük veya büyük olması durumunda değerin bu tür için sırasıyla en düşük veya en yüksek değere ayarlandığı anlamına gelir.

Önceki davranış

Aşağıdaki tabloda, bir float veya double değeri dönüştürülürken önceki davranış gösterilmektedir.

Dönüştür... Değeri x (Önceki) sonuç
int skaler ve paketlenmiş int.MinValue <= x <= int.MaxValue (int)x
< int.MinValue veya > int.MaxValue int.MinValue
long skaler ve paketlenmiş long.MinValue <= x <= long.MaxValue (long)x
< long.MinValue veya > long.MaxValue long.MinValue
uint skaler ve paketlenmiş Tüm değerler (((long)x << 32) >> 32)
ulong skaler ve paketlenmiş <= 2^63 (long)x
> 2^63 (long)(x - 2^63) + 2^63

Yeni davranış

Aşağıdaki tabloda, bir float veya double değerini dönüştürürken oluşan yeni davranış gösterilmektedir.

Dönüştür... Değeri x .NET 9+ sonucu
int skaler ve paketlenmiş int.MinValue <= x <= int.MaxValue (int)x
< int.MinValue int.MinValue
> int.MaxValue int.MaxValue
NaN 0
long skaler ve paketlenmiş long.MinValue <= x <= long.MaxValue (long)x
< long.MinValue long.MinValue
> long.MaxValue long.MaxValue
NaN 0
uint skaler ve paketlenmiş 0 <= x <= uint.MaxValue (uint)x
x > uint.MaxValue uint.MaxValue
x < 0 0
ulong skaler ve paketlenmiş 0 <= x <= ulong.MaxValue (ulong)x
x > ulong.MaxValue ulong.MaxValue
x < 0 0

Sürüm kullanıma sunulmuştur

.NET 9 Önizleme 4

Hataya neden olan değişikliğin türü

Bu değişiklik davranışsal bir değişikliktir.

Değişiklik nedeni

Bu değişiklik, doygunluk davranışına sahip olmak ve davranışı belirleyici hale getirmek için tüm kayan noktadan tamsayıya dönüştürmeleri standartlaştırmak için yapılmıştır.

Önceki davranış bölümünde gösterilen değerlerin dönüştürmeden döndürülmesini kullandıysanız, bunlar yanlış olsa bile kodunuzu Yeni davranış bölümünde gösterilen değerleri bekleyecek şekilde güncelleştirin.

Yeni davranışın performans yükü senaryonuz için istenmeyen bir durumsa, bunun yerine hızlı olan Tek, Çift ve Yarı'da yeni ConvertToIntegerNative<TInteger> yöntemleri kullanabilirsiniz. Çoğu durumda, bu yöntemlerin davranışı önceki kayan noktadan tamsayıya dönüştürme davranışıyla eşleşir. Ancak, bu yöntemler önceki dönüştürme davranışıyla (zaten belirleyici olmayan) eşleşmesi garanti edilmeyen platforma özgü davranışlara sahiptir. Bunun yerine, bu yöntemler yerel platform için en verimli olan her şeyi yapar. Özellikle, türün temsil edilebilir aralığının TInteger dışındaki değerler için sonuç garanti edilmez.

Performansa ve önceki dönüştürme davranışıyla eşleşmenin kesin garantisine ihtiyaç duyduğunuz nadir durumlarda platforma özgü donanım iç bilgilerini kullanabilirsiniz. Örneğin, için işlemek (int)val için Sse.ConvertToInt32(Vector128.CreateScalar(val)) kullanabilirsinizfloat. Kullanmadan önce denetlemeniz if (Sse.IsSupported) gerekir. Ancak diğer hedef platformlar (arm64 gibi) zaten farklı sonuçlar ürettiği için bu iç bilgileri kullanmak karmaşıktır.

Etkilenen API’ler

Kayan noktadan tamsayıya tüm açık ve örtük atamalar:

  • (int)valburada val veya floatdouble
  • Vector.ConvertToInt32(Vector<float> val)
  • (long)valburada val veya floatdouble
  • Vector.ConvertToInt64(Vector<double> val)
  • (uint)valburada val veya floatdouble
  • Vector.ConvertToUInt32(Vector<float> val)
  • (ulong)valburada val veya floatdouble
  • Vector.ConvertToUInt64(Vector<double> val)