ArithmeticGeometricMean [算术-几何平均数]
# 介绍
算术 - 几何平均是一种特殊平均,即算术平均与几何平均的合成平均。两个正实数 和 的算术 - 几何平均数定义如下:
首先计算 和 算术平均数 (相加平均), 称其为 。然后计算 和 几何平均数 (相乘平均), 称其为 ; 这是 的算术平方根。
然后重复这个步骤,这样便得到了两个数列 和 :
这两个数列收敛于相同的数,这个数称为 和 的算术 - 几何平均数,记为 , 或 agm 。
# 实现
# JavaScript
/**
* @function agm
* @description This finds the Arithmetic-Geometric Mean between any 2 numbers.
* @param {Number} a - 1st number, also used to store Arithmetic Mean.
* @param {Number} g - 2nd number, also used to store Geometric Mean.
* @return {Number} - AGM of both numbers.
* @see [AGM](https://en.wikipedia.org/wiki/Arithmetic%E2%80%93geometric_mean)
*/
export const agm = (a, g) => {
if (a === Infinity && g === 0) return NaN
if (Object.is(a, -0) && !Object.is(g, -0)) return 0
if (a === g) return a // avoid rounding errors, and increase efficiency
let x // temp var
do {
[a, g, x] = [(a + g) / 2, Math.sqrt(a * g), a]
} while (a !== x && !isNaN(a))
/*
`x !== a` ensures the return value has full precision,
and prevents infinite loops caused by rounding differences between `div` and `sqrt` (no need for "epsilon").
If we were to compare `a` with `g`, some input combinations (not all) can cause an infinite loop,
because the rounding mode never changes at runtime.
Precision is not the same as accuracy, but they're related.
This function isn't always 100% accurate (round-errors), but at least is more than 95% accurate.
`!isNaN(x)` prevents infinite loops caused by invalid inputs like: negatives, NaNs and Infinities.
`x !== a`确保返回值具有全精度并防止因`div`和`sqrt`之间的四舍五入引起的无限循环(不需要 "epsilon")。
如果我们将`a`与`g`进行比较,一些输入组合(不是全部)会导致无限循环。因为四舍五入的模式在运行时不会改变。
精度不等同于准确度,但它们是相关的。这个函数并不总是100%准确(四舍五入错误),但至少是95%以上的准确。
`!isNaN(x)`防止由无效输入引起的无限循环,如:负数、NaN和无穷大。
*/
return a
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Object.is()
方法判断两个值是否是相同的值。这种相等性判断逻辑和传统的 ==
运算不同, ==
运算符会对它两边的操作数做隐式类型转换(如果它们类型不同),然后才进行相等性比较,(所以才会有类似 "" == false 等于 true 的现象),但 Object.is
不会做这种类型转换。这与 ===
运算符的判定方式也不一样。 ===
运算符(和 ==
运算符)将数字值 -0
和 +0
视为相等,并认为 Number.NaN
不等于 NaN
。
# 扩展
- 1 个动画,4 个均值:平方平均、算术平均、几何平均、调和平均:
# 参考
编辑 (opens new window)
上次更新: 2022/10/18, 20:15:06