現象
均方差 (MSE) 理論上 ≥ 0,但顯示負值;排序後相似度非遞增/遞減序。
核心原因排查
- 數值溢出/下溢 (最可能):
- 像素差值平方累加超出 `int`/`long` 範圍(如 4K 圖像 800萬像素 × 255² ≈ 5.2e11,超 32 位有符號整數 2.1e9)。
- 累加變量聲明為有符號整數,溢出繞回負數。
- 修正:累加器使用 `double` 或 `int64_t` (`long long`),單步轉型:`sum += (double)(p1 - p2) * (p1 - p2);`。
- 算法邏輯錯誤:
- 相似度定義混淆:MSE 越小越相似,若直接作為「相似度分數」排序需取倒數或負號。
- 歸一化公式錯誤:如 `similarity = 1 - MSE / MAX_MSE`,若 `MSE > MAX_MSE` 產生負值。
- 排序比較器錯誤:
- C++ `std::sort` 比較函數未嚴格弱序(如返回 `a <= b` 而非 `a < b`),導致未定義行為,輸出順序亂序。
- 浮點數比較未考慮精度:`fabs(a-b) < eps` 判等。
調試建議
- 對單張圖像打印中間變量:像素差、平方和、MSE 最終值,驗證計算鏈路。
- 使用單元測試框架 (Google Test) 覆蓋已知答案的標準圖像對。
- 啟用編譯器未定義行為檢測:`-fsanitize=undefined` (GCC/Clang) / `/RTC1` (MSVC)。