/**
* 相对误差计算函数。
*
* 相对误差计算比表面更为复杂[1,2]。传统计算公式为`|(A-E)/E|`,但存在两个关键问题:
* 1. 当期望值为零时,任何非零实际值都会产生无限大相对误差,这与直觉相悖(如期望电压为0时,测量到0.1伏特不应视为无穷大误差)
* 2. 该公式不满足数学度量的严格定义[3]。[4]提出使用`|ln(|A/E|)|`定义,但仅适用于正值场景(如-10与10的误差会被误判为0)
*
* 本实现遵循常规方案:
* - 当实际值与期望值均为零时返回0
* - 当期望值为零而实际值非零时返回Infinity
* - 其他情况返回`|(A-E)/E|`
*
* [1] 零点相对误差计算问题 https://math.stackexchange.com/questions/677852/how-to-calculate-relative-error-when-true-value-is-zero
* [2] 相对变化与差异 https://en.wikipedia.org/wiki/Relative_change_and_difference
* [3] 数学度量定义 https://en.wikipedia.org/wiki/Metric_(mathematics)#Definition
* [4] F.W.J.奥尔弗,《误差算术新方法》SIAM数值分析期刊, 15(2), 1978, DOI:10.1137/0715024
*
* @param {number} actual 实际测量值
* @param {number} expected 期望理论值
* @return {number} 相对误差计算结果
*/
function relativeError(actual, expected) {
// 以下条件判断逻辑已被测试覆盖
// 由于c8工具存在标记问题,暂时忽略覆盖率统计
/* c8 ignore start */
if (actual === 0 && expected === 0) {
return 0;
}
/* c8 ignore end */
return Math.abs((actual - expected) / expected);
}
export default relativeError;