import standardNormalTable from "./standard_normal_table.js";
/**
* **[累积标准正态概率](http://en.wikipedia.org/wiki/Standard_normal_table)**
*
* 由于无法为每个正态分布打印概率表(因为正态分布有无限多种),通常的做法是将正态分布转换为标准正态分布,
* 然后使用标准正态分布表查找概率。
*
* 你可以使用 `.5 + .5 * errorFunction(x / Math.sqrt(2))` 来计算概率,
* 而不是从表格中查找。
*
* @param {number} z 标准正态分布的z值
* @returns {number} 累积标准正态概率
*/
function cumulativeStdNormalProbability(z) {
// 计算该值的位置。
const absZ = Math.abs(z);
// 每一行以不同的有效数字开头:0.5、0.6、0.7等。表格中的每个值
// 对应输入值范围为0.01,因此该值乘以100。
const index = Math.min(
Math.round(absZ * 100),
standardNormalTable.length - 1
);
// 我们计算的索引必须在表格中为正值,
// 但我们仍然关注输入值是正还是负,并在最后一步翻转输出值。
if (z >= 0) {
return standardNormalTable[index];
} else {
// 由于浮点数运算,表格中具有4位有效数字的值在计算时可能会变成循环小数。
return Math.round((1 - standardNormalTable[index]) * 1e4) / 1e4;
}
}
export default cumulativeStdNormalProbability;