1.多项式求值
抛出一个问题,假设
x
=
1
/
2
x=1/2
x=1/2 怎么做才能以最优的方式计算以下方程?
P
(
x
)
=
2
x
4
+
3
x
3
−
3
x
2
+
5
x
−
1
P(x)=2x^4+3x^3-3x^2+5x-1
P(x)=2x4+3x3−3x2+5x−1
最简单的办法就是
p
(
1
2
)
=
2
∗
1
2
∗
1
2
∗
1
2
∗
1
2
+
3
∗
1
2
∗
1
2
∗
1
2
−
3
∗
1
2
∗
1
2
+
5
∗
1
2
−
1
p(\frac{1}{2})=2*\frac{1}{2}*\frac{1}{2}*\frac{1}{2}*\frac{1}{2}+3*\frac{1}{2}*\frac{1}{2}*\frac{1}{2}-3*\frac{1}{2}*\frac{1}{2}+5*\frac{1}{2}-1
p(21)=2∗21∗21∗21∗21+3∗21∗21∗21−3∗21∗21+5∗21−1
上述式子总共10次乘法,4次加法(计算机中减法是通过加法实现的,具体计算机减法计算过程)。
换个思路:
将方程写成以下形式
P
(
x
)
=
−
1
+
x
∗
(
5
+
x
∗
(
−
3
+
x
∗
(
3
+
x
∗
2
)
)
)
P(x)=-1+x*(5+x*(-3+x*(3+x*2)))
P(x)=−1+x∗(5+x∗(−3+x∗(3+x∗2)))
我们只需要计算,4次乘法,4次加法.这种方法被称为嵌套乘法或者霍纳方法
2.二进制数字
整数的二进制表示以及加减法过程看这里
下面说说小数部分,计算机存储小数是以二进制的形式存储的,而有限的计算机资源并不可能完全表示无穷的小数部分。
举个例子:
我们有十进制下的小数
(
0.4
)
10
(0.4)_{10}
(0.4)10 他的二进制表示是这样的:
0.42 = 0.8 < 1 整数部分 0 余 0.4
0.82 = 1.6 > 1 整数部分 1 余 0.6
0.6*2 = 1.2 > 1 整数部分 1 余 0.2
…
简单来说就是小数部分不断与2相乘记录整数部分。最后
(
0.4
)
10
(0.4)_{10}
(0.4)10的二进制表示是无穷的
(
0.011011011.....
)
2
(0.011011011.....)_{2}
(0.011011011.....)2,计算机在存储该小数部分的时候会简单舍去 (或者通过某种规则舍去)无效部分,这就是精度丢失。
加入我们得到一个二进制的小数,如何恢复成十进制呢?
有
(
0.1011
)
2
(0.1011)_{2}
(0.1011)2,将其转化成十进制:
2
−
1
+
0
+
2
−
3
+
2
−
4
=
1
2
+
1
8
+
1
16
=
11
16
2^{-1}+0+2^{-3}+2^{-4}=\frac{1}{2}+\frac{1}{8}+\frac{1}{16}=\frac{11}{16}
2−1+0+2−3+2−4=21+81+161=1611
3.实数的浮点表示
用有限的计算机资源表示无穷的浮点数会造成不可避免的精度损失,而这些损失在计算一些数学问题的时候会把误差累加到一个非常大的规模。本小节主要讨论就是这个问题。
浮点数包含三个部分:符号,尾数,指数
精度 | 符号 | 指数 | 尾数 |
---|---|---|---|
单精度 | 1 | 8 | 23 |
双精度 | 1 | 11 | 52 |
长双精度 | 1 | 15 | 64 |