Math && Program && Big-man
- Big-man从小的梦想是做一位数学老师,因为接收到中学数学老师的熏陶,酷爱数学这门学科,也比较想要去通过自己的方法去传授自己理解的数学。所以在这些文章里面也是想要通过自己理解的方式去解决一些复杂的问题。
- 有这两张图可以得出,数学与计算机的结合存在多么密切的关系,在这里我们也就需要一步步地进行渗透。
- 首先需要来掌握一下误差(Error):
- 为什么会存在误差或者说是什么导致了误差的产生?
- 1、从实际问题中抽象出数学模型——模型误差(Modeling Error)
- 2、通过观察得到模型中的某些参数(或者物理量)的值。——观测误差(Measurement Error)。
- 3、数学模型与数值模型算法之间的误差。——方法误差(截断误差(Truncation Error))。
- 4、由于机器字长有限,原始数据和计算过程会产生新的误差——舍入误差(Roundoff Error)。
- 对误差类型进行分析之后,我们需要对误差的详细方法进行解析:
- 绝对误差(Absolute Error):
- 设x为真值(也就是所谓的精确值), x* 为x的一个近似值,称e* = x* - x 为近似值x*的绝对误差值,同时也被简称为误差。
- 注:误差可正可负,常常是无限位的。
- 绝对误差限(accuracy) —— 绝对值的上限值 E * , 所以有|e*| = |x * - x| <= E *。比如:
- π * = 3.14159; | π * - π | <= (1/2) * 10−5 。
- 在数学中绝对误差还不能完全表示近似值的好坏。
- 相对误差(relative error):
- 近似值x* 的误差 e* 与准确值x的值:
- e∗x = x∗−xx 称为近似值x*的相对误差,记住 e∗r = e∗x 。
- 注:实际计算时,相对误差通常取:
- e∗r = e∗x∗ = x∗−xx∗
- 因为: e∗x - e∗x∗ = e∗∗(x∗−x)x∗x∗ = (e∗)2x∗(x∗−e∗) = (e∗/x∗)(1−e∗/x∗) 。
- 相对误差也是可正可负,常常是无限位的。
- 相对误差限——相对误差的绝对值的上界 Er *
- e∗x∗ = x∗−xx∗ <= E∗r
- 有效数字:
- 若近似值 x∗ 与准确值的误差绝对值不超过某一位的半个单位,该位到 x∗ 的第一位非零数字共有n位,则称 x∗ 有n为有效数字。
- 计算机的体系结构
- 计算机的数系是一个不完整的数系。计算机只能表示有限个数,即计算机的精度是有限的。
- 每种计算机内部运算是按照固定的有限位数进行的,也就是按照固定位数的有限位浮点数进行运算的。
- 浮点数系统由四个整数表征: 基 B ,精度(尾数)位数t, 下溢界L和上溢界U。
- 计算机所表示的数的集合(规格化浮点数系):
- F = {f = +/-().d1d2 … dt (称为尾数,j为阶) * Bj 0 <= di < B , 1 <= i <= t, d1 > 0, L <= j <= U} U {0}。
- 若f != 0, 则m <= |f| , 其中 m = BL−1 , M = BU (1 - B−t )。
- 所以计算的溢出是怎产生的?原因就在上面。
- 实际计算时,若初始数据或中间结果大于或小于 F中的数,就会产生溢出。
- 浮点数的运算特点:
- 设x, y均是规格化的浮点数,但它们的算术运算的精确结果不一定是F中的浮点数,计算机会自动把运算结果用浮点数表示出来 ——- 规格化。此外,由于计算机中参与运算的数的绝对值必须小于1,当两个数量级不同的相加减时需要先对阶(将阶码统一为较大的),然后尾数相加减。
- 并且在计算机中浮点数的运算不满足结合律,乘法对加法的分配律也不满足。
有效数字(另外一种定义形式):
用科学计数法, 记 x∗ = (+/-) 0. a1 a2 … an * 10m 其中 a1 ≠ 0,m ∈ Z, a1 , a2 , … , an ∈ {0, 1, …, 9} 若 | x - x∗ | ≤ 0.5 * 10m / 10n (即 an 的截取按四舍五入规则),则称 x∗ 为有n位有效数字,精确到 10m / 10n 。
例1: π = 3.1415926535897932 ……; π∗ = 3.1415, 求: π∗ 有几位有效数字?请证明你的结论。
证明: 因为 π∗ = 0.31415 * 101 , and | π∗ - π | < 0.5 * 101 / 104
- π∗ 有4位有效数字,精确到小数点后第3位。
注:0.2300有4位有效数字,而00023只有两位数字。12300如果写成0.123 * 105 , 则表示最多只有3位有效数字。数字末尾的0不可随意省去。可能有人就会询问,那在计算机中会不会把末尾的0去掉了,所以Big-man带领大家做一个简单的编程测试,计算机中会不会把末尾的0去掉了?由于现在的操作系统语音大部分都改用为了C,所以在这里的尝试去书写的语言也是C语言,Big-man其实测试的非常简单,只要采用类似与下面的代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
double a = 0.2300;
double b = 0.2300;
printf("%f\n", a);
printf("%f\n", b);
printf("%f\n", a+b);
return 0;
}
输出:
0.230000
0.230000
0.460000
- Big-man刚开始也是不理解,为什么计算机会这样处理我输入的程序了?所以Big-man开始继续测试…
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
float a = 0.2300;
float b = 0.2300;
printf("%f\n", a);
printf("%f\n", b);
printf("%f\n", a+b);
return 0;
}
- 输出:
0.230000
0.230000
0.460000
- 原本Big-man会认为是C语言中单精度和双精度的原因造成的差异,但是转念一想并进行了测试,发现并不是这么回事的?所以Big-man又陷入了沉思…
- 注:若 x∗ 的每一位都是有效数字,则 x∗ 称有效数。
- 特别,经“四舍五入”得到的数均为有效数。
- 证明方法:
在这里Big-man需要进行分析一下,第一个的证明方式很正常,大概推论一下就可以得出,Big-man为了不让大家不动手就知道答案,第一个就不再进行分析了,但是第二个的分析Big-man要在这里进行讲解一下,为什么了?当然是因为以Big-man的数学头脑一时间都没有想明白这个计算的由来,所以也就特别的慌张。
第二种证明方式的分析:
由于上面写的markdown当中数学符号出现了问题,所以在这里也就没有使用markdown中的数学符号就行表示,给出了一张图片就行讲解了。
以上的证明方法得出了一个定义以及一个定理:
- 定义:
- 设**实数**x为某个量的精确值,
x∗
为它的一个近似值, 且
x∗
规格化浮点数形式为
- x∗ = ± 10m * 0. d1 d2 … dn
- 其中m为整数,
d1
,
d2
,
⋯
,
dn
为0到9中任一数字, 若
x∗
的绝对误差不超过末位的半个单位, 即:
- | x - x∗ | ≤ 12 * 10m−n
- 则称为 x∗ 为x的具有n位有效数字的近似值.
- 定理:
- 设
x∗
为精确值
x
的一个近似值, 且
x∗
规格化浮点数表示式为。若
x∗
为
x
的具有n位有效数字的近似值, 则其相对误差
Er∗
(
x
) 满足:
- Er∗ ( x ) ≤ |x−x∗||x∗| ≤ 5d1 * 10−n
- 反之, 若
x∗
的相对误差
Er∗
(
x
) 满足:
- Er∗ ( x ) ≤ |x−x∗||x∗| ≤ 5d1+1 * 10−n
- 则 x∗ 至少有n位有效数字。
- 总结:
- 根据以上定义和定理可知, 具有n位有效数字的近似数 x∗ 的绝对误差限为0.5 * 10m−n , 在m相同的情况下, n越大, 10m−n 的值越小, 所以对同一个量的不同近似值, 有效数字越多, 则绝对误差限越小。并且有效数字位数可刻画近似数的精确度, 相对误差限与有效数字的位数有关, 有效数字位越多, 相对误差限也越小, 反之亦然。
- Big-man这里先来一道联系例题再说吧。
数值计算及稳定性:
JackDan9 Thinking