Share via


SSE 和 SSE2 CompareGreaterThan 方法可妥善處理 NAN 輸入

下列 System.Runtime.Intrinsics.X86.SseSystem.Runtime.Intrinsics.X86.Sse2 方法已經過修正,可妥善處理 NaN 輸入並比對 System.Runtime.Intrinsics.X86.Avx 類別中對等方法的硬體行為:

  • CompareGreaterThan
  • CompareGreaterThanOrEqual
  • CompareNotGreaterThan
  • CompareNotGreaterThanOrEqual
  • CompareScalarGreaterThan
  • CompareScalarGreaterThanOrEqual
  • CompareScalarNotGreaterThan
  • CompareScalarNotGreaterThanOrEqual

變更描述

先前針對列出的 SseSse2 方法的 NaN 輸入會傳回不正確的結果。 該結果也與 Avx 類別中對應方法產生的結果不同。

從 .NET 5 開始,這些方法都能正確處理 NaN 輸入,並傳回與 Avx 類別中的對應方法相同的結果。

Streaming SIMD Extensions (SSE) 和 Streaming SIMD Extensions 2 (SSE2) 產業標準結構 (ISA) 不為這些比較方法提供直接硬體支援,因此這些方法實作於軟體中。 先前這些方法並未妥善實作,因此以不正確的方式處理了 NaN 輸入。 針對原生移植的程式碼,不正確的行為會導致錯誤。 針對 256 位元程式碼路徑,這些方法也會產生與 Avx 類別中對等方法不同的結果。

若想了解這些方法先前不正確的方式,您可將 CompareNotGreaterThan(x,y) 實作為 CompareLessThanOrEqual(x,y) 做為一般整數。 不過,針對 NaN 輸入,這項邏輯會計算錯誤的結果。 反之,請用 CompareNotLessThan(y,x) 正確比較數字,同時NaN 列入考量。

導入的版本

5.0

  • 如果先前的行為產生錯誤,則無須進行變更。

  • 如果先前的行為合宜,則可變更相關叫用來維持該行為,如下所示:

    • CompareGreaterThan(x,y) ->CompareNotLessThanOrEqual(x,y)
    • CompareGreaterThanOrEqual(x,y) ->CompareNotLessThan(x,y)
    • CompareNotGreaterThan(x,y) ->CompareLessThanOrEqual(x,y)
    • CompareNotGreaterThanOrEqual(x,y) ->CompareLessThan(x,y)
    • CompareScalarGreaterThan(x,y) ->CompareScalarNotLessThanOrEqual(x,y)
    • CompareScalarGreaterThanOrEqual(x,y) ->CompareScalarNotLessThan(x,y)
    • CompareScalarNotGreaterThan(x,y) ->CompareScalarLessThanOrEqual(x,y)
    • CompareScalarNotGreaterThanOrEqual(x,y) ->CompareScalarLessThan(x,y)

受影響的 API