Skip to content

Commit 7d25fcf

Browse files
committed
add math
1 parent a880d94 commit 7d25fcf

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

math/math.md

+25
Original file line numberDiff line numberDiff line change
@@ -1289,6 +1289,31 @@ void cv::transform(
12891289
cv::OutputArray dst, // Output N-by-1 array (Dd channels) Dd通道的N*1矩阵
12901290
cv::InputArray mtx // Transform matrix (Ds-by-Dd) 变换矩阵是Ds * Dd矩阵
12911291
);
1292+
```
1293+
如何避免大数吃小数的
1294+
1295+
https://blog.csdn.net/aqzwss/article/details/53959570#:~:text=kahan%E6%B1%82%E5%92%8C%E7%AE%97%E6%B3%95%E8%83%BD
1296+
1297+
首先,这个算法就是用来求和的,求a1+a2+a3+...为什么不直接相加呢,而要用Kahan求和公式呢,这个算法的用武之地在哪呢,一一道来,kahan求和算法能避免大数吃小数的情况。
1298+
1299+
大数吃小数是什么意思呢?举个例子,我们用两个float相加,float是32位,它的精度是小数点后6-7位,设有a=123456;b=2.189;a+b应该是123458.189但是由于float的精度只有小数点后6-7位,所以必然得不到123458.189,后面的89可能会截掉,8不一定,9是必然会截掉的。好的,才做一个加法就产生至少了0.009的误差,做1000个这样的加法,误差就是9了,这显然不是我们想要的。
1300+
1301+
kahan求和算法可以避免这种情况,它有一个数用来记住那个被截断的小数,同样做下面的计算,设有a=123456;b=2.189;计算a+b。kahan求和算法是这样做的:sum=a+b(不准确); temp= (a+b)-a-b;temp等于多少呢,初看这不就是0吗?不是的,计算机此时算的可不是0,而是等于-0.009,就是被截断的那个小数。通过一个临时变量我们就记住了这个误差,当计算下一个加法的时候,可以把这个误差补上,并且更新误差到sum。
1302+
1303+
其实也可以这样理解,sum不是由于数太大,占用了小数的精度吗,而这个小数在当前一步看似是可以忽略的,但是由于,迭代的次数旁道,小数会累积成大误差,那么我们另外用的float专门记住这个误差小数不就得了吗。
1304+
1305+
```python
1306+
function KahanSum(input)
1307+
var sum = 0.0
1308+
var c = 0.0 #A running compensation for lost low-order bits.
1309+
for i = 1 to input.length do
1310+
y = input[i] - c #So far, so good: c is zero.
1311+
t = sum + y #Alas, sum is big, y small, so low-order digits of y are lost.
1312+
c = (t - sum) - y #(t - sum) recovers the high-order part of y; subtracting y recovers -(low part of y)
1313+
sum = t #Algebraically, c should always be zero. Beware eagerly optimising compilers!
1314+
#Next time around, the lost low part will be added to y in a fresh attempt.
1315+
return sum
1316+
12921317
```
12931318
## 概率论
12941319
### 二项分布

0 commit comments

Comments
 (0)