查看“︁警戒位”︁的源代码
←
警戒位
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
在[[数值分析|数值分析中]] ,可以使用一个或多个'''警戒位'''来减少[[数值修约|舍入]]误差。 如果说一个许多步骤计算的最终结果可以安全地舍入到 ''N'' 位小数,那么,最终的舍入操作引入的舍入误差对整体不确定性的影响可以忽略不计。 然而,在中间步骤舍入到同样多的位数很可能是'''不'''安全的。 因为舍入误差可以累积。 如果中间步骤中用了 ''M'' 位小数,那么就有 ''M−N'' 个警戒位。 在多数计算系统中,浮点运算都会用到警戒位。例如 <math>2^1 \times 0.100_2 - 2^0 \times 0.111_2</math> 我们必须对齐它们的位数。也就是说我们必须向第一个操作数额外添加一位,即警戒位。 因此我们有 <math>2^1 \times 0.1000_2 - 2^1 \times 0.0111_2</math>,计算可得 <math>2^1 \times 0.0001_2</math> 或 <math>2^{-2} \times 0.100_2</math>. 如果不用警戒位的话,就是 <math>2^1 \times 0.100_2 - 2^1 \times 0.011_2</math>,计算得到 <math>2^1 \times 0.001_2</math> 或 <math>2^{-1} \times 0.100_2</math>。产生了100%的相对误差。由此可见警戒位的重要性。 以下一段 [[C语言|C]] 代码说明了一个由浮点舍入导致的错误:<syntaxhighlight lang="c"> int main(){ double a; int i; a = 0.2; a += 0.1; a -= 0.3; for(i = 0; a < 1.0; i++) a += a; printf("i=%d, a=%f\n", i, a); return 0; } </syntaxhighlight> 看上去程序不会终止。 然而输出是<span> </span>: i=54, a=1.000000 另一个例子是: 给定2个数字:<math>2.56*10^0</math> 和 <math>2.34*10^2 </math>。我们使第一个数字中 <math>10</math> 的幂次和第二个数字一致,即:<math>0.0256*10^2</math>。那么两个数字的加和是: <pre> 0.0256*10^2 2.3400*10^2 + ____________ 2.3656*10^2 </pre>第二个数( <math>2.34*10^2 </math>)在填充两个 <math>0</math>之后,<math>4</math>后面的位数即警戒位,再后面的是舍入位。 舍入之后的结果是 <math>2.37</math> 而非 <math>2.36</math>,如果没有多余的位(警戒位和舍入位)的话,即仅考虑 <math>0.02+2.34 = 2.36</math>。误差是 <math>0.01</math>。 == 参考文献 == * Forman S. Acton. ''Numerical Methods that Work'', The Mathematical Association of America (August 1997). * Higham, Nicholas J. ''Accuracy and Stability of Numerical Algorithms'', Washington D.C.: Society for Industrial & Applied Mathematics, 2002. [[Category:带有C代码示例的条目]] [[Category:数值分析]]
返回
警戒位
。
导航菜单
个人工具
登录
命名空间
页面
讨论
不转换
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息