다음을 통해 공유


부동 소수점-정수 변환이 포화 상태임

이제 부동 소수점-정수 변환은 x86 및 x64 컴퓨터에서 포화 동작을 갖습니다. 포화 동작은 변환된 값이 대상 형식에 비해 너무 작거나 큰 경우 해당 형식에 대해 값이 각각 최소값 또는 최대값으로 설정된다는 것을 의미합니다.

이전 동작

다음 표는 float 또는 double 값을 변환할 때의 이전 동작을 보여줍니다.

변환 대상 x의 값 (이전) 결과
int 스칼라 및 압축됨 int.MinValue <= x <= int.MaxValue (int)x
< int.MinValue 또는 > int.MaxValue int.MinValue
long 스칼라 및 압축됨 long.MinValue <= x <= long.MaxValue (long)x
< long.MinValue 또는 > long.MaxValue long.MinValue
uint 스칼라 및 압축됨 모든 값 (((long)x << 32) >> 32)
ulong 스칼라 및 압축됨 <= 2^63 (long)x
> 2^63 (long)(x - 2^63) + 2^63

새 동작

다음 표는 float 또는 double 값을 변환할 때의 새 동작을 보여줍니다.

변환 대상 x의 값 .NET 9+ 결과
int 스칼라 및 압축됨 int.MinValue <= x <= int.MaxValue (int)x
< int.MinValue int.MinValue
> int.MaxValue int.MaxValue
NaN 0
long 스칼라 및 압축됨 long.MinValue <= x <= long.MaxValue (long)x
< long.MinValue long.MinValue
> long.MaxValue long.MaxValue
NaN 0
uint 스칼라 및 압축됨 0 <= x <= uint.MaxValue (uint)x
x > uint.MaxValue uint.MaxValue
x < 0 0
ulong 스칼라 및 압축됨 0 <= x <= ulong.MaxValue (ulong)x
x > ulong.MaxValue ulong.MaxValue
x < 0 0

도입된 버전

.NET 9 미리 보기 4

호환성이 손상되는 변경의 형식

이 변경 사항은 동작 변경입니다.

변경 이유

이 변경은 모든 부동 소수점-정수 변환 시 포화 동작을 갖도록 표준화하고 동작을 결정적으로 만들기 위한 것입니다.

이전 동작 섹션에 표시된 값을 사용하여 변환에서 반환되는 경우 맞지 않더라도 새 동작 섹션에 표시된 값을 예상하도록 코드를 업데이트합니다.

시나리오에서 새 동작의 성능 오버헤드가 바람직하지 않은 경우에는 빠른 Single, Double, Half에서 새 ConvertToIntegerNative<TInteger> 메서드를 사용해도 됩니다. 대부분의 경우에서 이러한 메서드의 동작은 이전 부동 소수점-정수 변환 동작과 일치합니다. 그러나 이러한 메서드에는 이전 변환 동작과 일치하도록 보장되지 않는(이미 비결정적) 플랫폼별 동작이 있습니다. 대신, 이러한 메서드는 네이티브 플랫폼에 가장 효율적인 작업을 수행합니다. 특히, TInteger 형식의 표시 가능 범위를 벗어나는 값에 대해서는 결과가 보장되지 않습니다.

드물지만 성능과 이전 변환 동작의 일치를 엄격하게 보장해야 하는 경우 플랫폼별 하드웨어 내장 함수를 사용할 수 있습니다. 예를 들어, Sse.ConvertToInt32(Vector128.CreateScalar(val))를 사용하여 float(int)val을 처리할 수 있습니다. 사용 전에 if (Sse.IsSupported)를 확인해야 합니다. 그러나 다른 대상 플랫폼(예: Arm64)에서 이미 다른 결과를 생성하기 때문에 이러한 내장 함수를 사용하는 것이 까다롭습니다.

영향을 받는 API

부동 소수점에서 정수까지 모든 명시적 및 암시적 캐스트:

  • (int)val 여기서 valfloat 또는 double
  • Vector.ConvertToInt32(Vector<float> val)
  • (long)val 여기서 valfloat 또는 double
  • Vector.ConvertToInt64(Vector<double> val)
  • (uint)val 여기서 valfloat 또는 double
  • Vector.ConvertToUInt32(Vector<float> val)
  • (ulong)val 여기서 valfloat 또는 double
  • Vector.ConvertToUInt64(Vector<double> val)