int a = int.MaxValue, b = 1, c = -a;
// 未檢查:a+(b+c)=1, (a+b)+c=1(溢位環繞)
// checked:a+(b+c)=1, (a+b)+c → OverflowException
// 結論:整數溢位語境下,運算順序影響異常拋出時機
float a = float.MaxValue; // ~3.4e38
float b = -a; // -3.4e38
float c = -1;
Console.WriteLine(a + (b + c)); // 0
Console.WriteLine((a + b) + c); // -1
a + b → 0(精確抵消)0 + c → -1b + c → b(c 相對 b 太小,被捨入為 0)a + b → a(同理)a + 0 → a → 但實際 b+c 因對齊指數導致 c 丟失,結果為 a + b = 0IEEE 754 浮點數非結合律:有限精度導致中間結果捨入,順序改變捨入誤差累積路徑。
C# checked 僅影響整數溢位檢查,對浮點數無效。浮點數溢位產生 Infinity,不拋出異常。因此:
// checked 語境下輸出同無檢查:0 和 -1
// 不會拋出異常
decimal(128 位十進制)或任意精度庫。-ffast-math 可能重新排序浮點運算,破壞數值穩定性。數學結合律在有限精度浮點數中不成立。整數在 checked 下溢位拋異常,順序影響異常點;浮點數靜默捨入,順序影響最終精度。工程師必須有「浮點數非結合」的肌肉記憶,關鍵路徑採用數值穩定算法或高精度類型。