数值计算:真正的Lec0?

计算多项式 Evaluating a Polynomial

求多项式的值的最佳方式是什么?

What is the best way to evaluate a Polynomial?

  • 普通办法:直接一次一次算
  • 降幂系数:将多项式写成降幂系数形式后嵌套

一般嵌套(Horner)过程:

P(x)=anxn+an−1xn−1+⋯+a1x+a0=a0+x(a1+x(a2+⋯+x(an−1+anx)⋯))\begin{aligned} P(x) &= a_{n}x^{n} + a_{n-1}x^{n-1} + \cdots + a_{1}x + a_{0} \\ &= a_{0} + x\Bigl(a_{1} + x\bigl(a_{2} + \cdots + x(a_{n-1} + a_{n}x)\cdots\bigr)\Bigr) \end{aligned}

二进制数 Binary Numers

二进制转十进制

对于一个二进制数

b3b2b1b0.b−1b−2\begin{aligned} b_{3}b_{2}b_{1}b_{0}.\,b_{-1}b_{-2} \end{aligned}

转为十进制为

b3⋅23+b2⋅22+b1⋅21+b0⋅20+b−1⋅2−1+b−2⋅2−2\begin{aligned} b_{3}\cdot 2^{3} + b_{2}\cdot 2^{2} + b_{1}\cdot 2^{1} + b_{0}\cdot 2^{0} + b_{-1}\cdot 2^{-1} + b_{-2}\cdot 2^{-2} \end{aligned}


关于小数部分的小妙招

将小数部分设x后求解

x=(0.1011)2\begin{aligned} x = (0.\overline{1011})_{2} \end{aligned}

则可以得到

24x=1011.1011x=0000.1011(24−1)x=(1011)2=11x=1115\begin{aligned} 2^{4}x &= 1011.\overline{1011} \\ x &= 0000.\overline{1011} \\ (2^{4}-1)x &= (1011)_{2} = 11 \\ x &= \frac{11}{15} \end{aligned}

试一试:把(11.1101)2(11.1\overline{101})_{2} 转为十进制(点击查看答案)

答案:(11.1101)2=3+67=277(11.1\overline{101})_{2} = 3 + \frac{6}{7} = \frac{27}{7}


十进制转二进制

假如我们要把十进制数53.7转为二进制数

整数部分

对于整数部分53

53÷2=26 R 126÷2=13 R 013÷2=6 R 16÷2=3 R 03÷2=1 R 11÷2=0 R 1\begin{aligned} 53 \div 2 &= 26 \ \mathrm{R}\ 1 \\ 26 \div 2 &= 13 \ \mathrm{R}\ 0 \\ 13 \div 2 &= 6 \ \mathrm{R}\ 1 \\ 6 \div 2 &= 3 \ \mathrm{R}\ 0 \\ 3 \div 2 &= 1 \ \mathrm{R}\ 1 \\ 1 \div 2 &= 0 \ \mathrm{R}\ 1 \end{aligned}

所以它的二进制为

(53)10=(110101.)2\begin{aligned} (53)_{10} = (110101.)_{2} \end{aligned}

小数部分

对于小数部分.7

0.7×2=0.4+10.4×2=0.8+00.8×2=0.6+10.6×2=0.2+10.2×2=0.4+00.4×2=0.8+0 ⋮(无限循环)\begin{aligned} 0.7 \times 2 &= 0.4 + 1 \\ 0.4 \times 2 &= 0.8 + 0 \\ 0.8 \times 2 &= 0.6 + 1 \\ 0.6 \times 2 &= 0.2 + 1 \\ 0.2 \times 2 &= 0.4 + 0 \\ 0.4 \times 2 &= 0.8 + 0 \\ &\ \vdots \quad \text{(无限循环)} \end{aligned}

所以它的二进制为

(0.7)10=(0.1011001100110…)2=(.10110)2\begin{aligned} (0.7)_{10} = (0.1011001100110\ldots)_{2} = (.\overline{10110})_{2} \end{aligned}

所以53.7的二进制即为

(53.7)10=(110101.10110)2\begin{aligned} (53.7)_{10} = (110101.\overline{10110})_{2} \end{aligned}

IEEE 浮点格式 IEEE Floating Point Formats

浮点数由三部分组成:符号(+ 或 −)sign bits、包含有效位串的尾数 mantissa bits,以及指数 exponent bits。这三个部分被存储在一个计算机字中。

precisionsign bitsexponent bitsmantissa bitsbiassingle1823127double111521023long double1156416383BF16187127\begin{array}{l|c|c|c|c} \hline \text{precision} & \text{sign bits} & \text{exponent bits} & \text{mantissa bits} & \text{bias} \\ \hline \text{single} & 1 & 8 & 23 & 127 \\ \text{double} & 1 & 11 & 52 & 1023 \\ \text{long double} & 1 & 15 & 64 & 16383 \\ \text{BF16} & 1 & 8 & 7 & 127 \\ \hline \end{array}


这样我们就能表示任何一个值了

value=sign×2exponent−bias×mantissa,mantissa=1.(mantissa bits)\begin{aligned} \text{value} &= \text{sign} \times 2^{\,\text{exponent}-\text{bias}} \times \text{mantissa}, \\ \text{mantissa} &= 1.(\text{mantissa bits}) \end{aligned}
试一试:把5.75用single表示(点击查看答案)

先把十进制写成二进制科学计数法

5.7510=101.112=1.01112×22\begin{array}{rcl} 5.75_{10} &=& 101.11_{2} \\ &=& 1.0111_{2} \times 2^{2} \end{array}

我们可以得到

sign=+1exponent=2mantissa=1.01112=1+2−2+2−3+2−4=1.4375\begin{array}{rcl} \text{sign} &=& +1 \\ \text{exponent} &=& 2 \\ \text{mantissa} &=& 1.0111_{2} = 1 + 2^{-2} + 2^{-3} + 2^{-4} = 1.4375 \end{array}

真实的指数为

exponent=2+127=129=100000012\begin{array}{rcl} \text{exponent} &=& 2 + 127 \\ &=& 129 \\ &=& 10000001_{2} \end{array}

对应 32 位布局就是

sign (1)exponent (8)mantissa bits (23)01000000101110000000000000000000\begin{array}{c|c|c} \hline \text{sign (1)} & \text{exponent (8)} & \text{mantissa bits (23)} \\ \hline 0 & 10000001 & 01110000000000000000000 \\ \hline \end{array}

计算机算术中的舍入误差 Rounding Error

由于位数有限,因此会出现0.1 + 0.2 ≠ 0.3 的情况(因为0.1和0.3无法用有限位数来表示)


误差 Errors

绝对误差与相对误差 absolute error and relative error

设xx是真值 exact value,x∗x^{*}是 xx 的近似值 approximate。

绝对误差 absolute error(或直接说error) of x∗x^{*}

e(x∗)=x∗−x\begin{array}{rcl} e(x^{*}) &=& x^{*} – x \end{array}

相对误差 relative error of x∗x^{*}

ϵr(x∗)=x∗−xx∗=e(x∗)x∗\begin{array}{rcl} \epsilon_{r}(x^{*}) &=& \dfrac{x^{*} – x}{x^{*}} \\ &=& \dfrac{e(x^{*})}{x^{*}} \end{array}

误差界 Error bound

真值 xx 往往不知道,因而 e(x∗)e(x^{*})算不出来,只能找一个上界。若

|e(x∗)|=|x∗−x|≤ε(x∗)\begin{array}{rcl} |e(x^{*})| &=& |x^{*} – x| &\le& \varepsilon(x^{*}) \end{array}

则称 ε(x∗)\varepsilon(x^{*})为 x∗x^{*}的 误差界 error bound


误差估计 Estimation of error

设 y=f(x)y=f(x)。用近似值 x∗x^*代替真值 xx,则 yy的误差由中值定理给出:

e(y)=f(x∗)−f(x)=f′(ξ)(x∗−x)\begin{array}{rcl} e(y) &=& f(x^{*}) – f(x) \\ &=& f'(\xi)\,(x^{*} – x) \end{array}

其中 ξ\xi 在 xxx 与 x∗x^{*} 之间。若 x∗x^{*} 很接近 xx,可用 f′(x∗)f'(x^{*})近似 f′(ξ)f'(\xi),则

|e(y)|=|f′(x∗)||e(x)|\begin{array}{rcl} |e(y)| &=& |f'(x^{*})|\,|e(x)| \end{array}

其中 |e(y)||e(x)|\dfrac{|e(y)|}{|e(x)|}​称为 放大因子 amplification factor ,也叫 绝对条件数 absolute condition number。


多变量误差估计

设 y=f(x1,x2)y=f(x_{1},x_{2})。用 x1∗,x2∗x_{1}^{*},x_{2}^{*} 代替真值后,

e(y∗)=y∗−y=f(x1∗,x2∗)−f(x1,x2)≃(∂f∂x1)∗(x1∗−x1)+(∂f∂x2)∗(x2∗−x2)≃(∂f∂x1)∗e(x1∗)+(∂f∂x2)∗e(x2∗)\begin{array}{rcl} e(y^{*}) &=& y^{*} – y \\ &=& f(x_{1}^{*},x_{2}^{*}) – f(x_{1},x_{2}) \\ &\simeq& \left(\dfrac{\partial f}{\partial x_{1}}\right)^{*}(x_{1}^{*}-x_{1}) + \left(\dfrac{\partial f}{\partial x_{2}}\right)^{*}(x_{2}^{*}-x_{2}) \\ &\simeq& \left(\dfrac{\partial f}{\partial x_{1}}\right)^{*} e(x_{1}^{*}) + \left(\dfrac{\partial f}{\partial x_{2}}\right)^{*} e(x_{2}^{*}) \end{array}

取绝对值,得到绝对误差上界:

|e(y∗)|≤|∂f∂x1|∗|e(x1∗)|+|∂f∂x2|∗|e(x2∗)|\begin{array}{rcl} |e(y^{*})| &\le& \left|\dfrac{\partial f}{\partial x_{1}}\right|^{*} |e(x_{1}^{*})| + \left|\dfrac{\partial f}{\partial x_{2}}\right|^{*} |e(x_{2}^{*})| \end{array}

有效数字 Significant Digits

如何计算有效数字?

若 x∗x^{*} 作为 xx 的近似值,其绝对误差不超过某一位数字的半个单位,而该数字到 x∗x^{*}的第一位非零数字共有 nn 位,则称 x∗x^{*}近似 xx时具有 nn位有效数字。

即存在某个十进制位(单位为 10k10^{k}),使得

|x∗−x|≤12×10k\begin{array}{rcl} |x^{*}-x| &\le& \dfrac{1}{2}\times 10^{k} \end{array}

666,看得我头晕。。。让我们来把他变得简单一点

如果绝对误差≤.00…05(n个0),则称n+1位有效数字


避免有效数字损失的办法

  1. 避免两个接近数字之间直接相减
    1. 开方相减 x+ϵ−x=ϵx+ϵ+x\begin{array}{rcl} \sqrt{x+\epsilon}-\sqrt{x} &=& \dfrac{\epsilon}{\sqrt{x+\epsilon}+\sqrt{x}} \end{array}
    2. 对数相减 ln⁡(x+ϵ)−ln⁡x=ln⁡(1+ϵx)\begin{array}{rcl} \ln(x+\epsilon)-\ln x &=& \ln\left(1+\dfrac{\epsilon}{x}\right) \end{array}
    3. 1−cos⁡(ϵ)=2sin2⁡(ϵ2)=sin2⁡(ϵ)1+cos⁡ϵ\begin{array}{rcl} 1-\cos(\epsilon) &=& 2\sin^{2}\!\left(\dfrac{\epsilon}{2}\right) &=& \dfrac{\sin^{2}(\epsilon)}{1+\cos\epsilon}\end{array}
  2. 避免大数字直接和小数字运算
  3. 避免大乘数和小除数

课后作业

把十进制数14.65化为二进制

答案:

把二进制数(11.1101)2\begin{array}{rcl} (11.1\overline{101})_{2} \end{array}化为十进制。

答案:

下面的数各有几位有效数字?绝对误差界和相对误差界分别是多少?
x1∗=4.7021x2∗=0.067x3∗=280.20\begin{array}{rcl} x_{1}^{*} &=& 4.7021 \\ x_{2}^{*} &=& 0.067 \\ x_{3}^{*} &=& 280.20 \end{array}

答案:

为避免有效数字丢失,应如何计算下列表达式?
x+1x−x−1x,|x|≫1\begin{array}{rcl} \sqrt{x+\dfrac{1}{x}} – \sqrt{x-\dfrac{1}{x}}, \qquad |x|\gg 1 \end{array}
∫NN+111+x2dx,N 很大\begin{array}{rcl} \displaystyle\int_{N}^{N+1}\dfrac{1}{1+x^{2}}\,\mathrm{d}x, \qquad N\text{ 很大} \end{array}

答案:

评论

  1. 小黑子
    6 天前
    2026-11-08 17:51:01

    来合个影成为古人吧😎

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!