计算机在运算时会不会出现误差

来源:百度文库 编辑:超级军网 时间:2024/04/28 07:13:23
比如对那种计算量非常大的工作,比如气象预报,破译密码之类?比如对那种计算量非常大的工作,比如气象预报,破译密码之类?
任何涉及AD(analog to digital)的计算都有量化误差
]]
浮点运算都存在近似的问题吧[:a9:] [:a9:] [:a9:]
早期的电脑1+1=1.99也算正常
误差肯定是有的,而且数据要校验要纠错
LZ没有学过算法吧。。。。
如果误差是指意料之外的数据不一致性的话,那只能说明软硬件设计有问题。意料之中的误差和软硬件设计精度有关。AD/DA、浮点运算、有损压缩等等环节都会出现误差,只要误差控制在设计范围内就没问题。
]]
lz在说浮点数计算误差呢,还是程序设计的累计误差呢。

还是芯片级别的运算错误呢;P
当然,当数据进入了计算机系统后,还可能出现另外一重情况导致出现数据错误,就是数据在存取,I/O,网上传输时会出现误差,所以人们在设计计算机系统的时候引入了数据校验来处理这类误差(正如dark_knight兄所说),但这个跟cpu运算就关系不大了.
总之,如果一个计算机系统真的有无法解决的误差,那么把这个系统投入实际应用是不可想象的
原帖由 如果可以重来 于 2009-2-2 18:23 发表
当然,当数据进入了计算机系统后,还可能出现另外一重情况导致出现数据错误,就是数据在存取,I/O,网上传输时会出现误差,所以人们在设计计算机系统的时候引入了数据校验来处理这类误差(正如dark_knight兄所说),但这个跟c ...

关键是误差和错误,这两个概念可完全不同
1/3=0.33333……
这就算误差了吧
错误也可能出现喽,比如极限超频的状态,可能逻辑错误
楼主指得大概是错误。
原帖由 worker2006 于 2009-2-2 15:14 发表
比如对那种计算量非常大的工作,比如气象预报,破译密码之类?



看看第一枚阿里亚纳5型火箭的下场吧,浮点溢出,当空爆炸
原帖由 qiyuwanjia 于 2009-2-2 20:31 发表
1/3=0.33333……
这就算误差了吧
错误也可能出现喽,比如极限超频的状态,可能逻辑错误


所以公式计算过程中分布计算后再组合不如直接公式化简来的精确,但控制好了误差在可以接受范围也是可以的
所以有门数学叫数值分析:D :D :D :D :D
[ 手机发帖 ]
毕业之后混迹于企业信息管理软件开发最复杂算法写过一个牛顿迭代的算法白痴飘过……
高中物理的第一节实验课老师就说:误差是不能消灭只能够减小的……
要分清误差和错误……
对于浮点运算,误差几乎是一定存在的,但是浮点标准的表达方式保证了误差的范围(详细可以读一下Kahan的论文)。
至于早期Intel的问题,那个明显是一个设计错误而不是误差
原帖由 worker2006 于 2009-2-2 15:14 发表
比如对那种计算量非常大的工作,比如气象预报,破译密码之类?


数值误差
舍入误差
这个是最基本的。
误差分析也是必须要做的,无论什么模型。
这个么,对于cpu来说,控制在精度范围内的误差叫误差,不能控制在精度范围内的误差叫错误,这里所说的错误非广义上的错误
计算机是铁定有误差的,记住,计算机是用二进制数字表示我们的常规十进制,有些数字就表示不出来,必须靠特定的计算方法来解决
原帖由 squallgzy 于 2009-2-3 02:24 发表
计算机是铁定有误差的,记住,计算机是用二进制数字表示我们的常规十进制,有些数字就表示不出来,必须靠特定的计算方法来解决



进制转换哪里来的误差阿;P
]]
这个误差来自于常用的机内浮点数格式
你当然可以选择自己实现一个无舍入误差的浮点计算包

实际上这是很多科学函数库的必备
原帖由 如果可以重来 于 2009-2-3 01:00 发表
这个么,对于cpu来说,控制在精度范围内的误差叫误差,不能控制在精度范围内的误差叫错误,这里所说的错误非广义上的错误


误差是理论精确值和预计计算结果的差。比如圆周率取3.14,后面舍掉的部分就会带来误差。
错误是实际得到的结果和预计计算结果不一样。比如你算1+1出来结果不是2。
截断误差是不可避免的……
原帖由 silentgod 于 2009-2-3 11:28 发表
截断误差是不可避免的……


对于有理数计算还是可以规避浮点舍入误差的说
楼上们估计没有理解楼主的意思。。

可能lz问的是。会不会出现1+1=3这种错误。
原帖由 Silk_Blade 于 2009-2-3 07:39 发表

怎么没有?把十进制的0.1转成定点二进制写出来看看?
至于浮点,不管你是N位浮点数,到了N+1位总是要出现误差的。



有限十进制转化为二进制哪里来的误差。不要跟计算机内位数限制扯在一起
原帖由 绝望的人流浪 于 2009-2-3 12:19 发表
楼上们估计没有理解楼主的意思。。

可能lz问的是。会不会出现1+1=3这种错误。


理论上存在出现问题的可能,比如某个门电路被宇宙射线轰到了

极高可靠要求的系统
好像都会要求多个相同系统并发计算然后对结果少数服从多数
极其偶然的错误计算机还是会犯的

例如一个存储在内存或硬盘里的数字1, 读出来的时候就被当成0了, 这样运算结果肯定就不对, 这些现象是必然发生无法避免的.

解决的办法是加入各种校验算法, 实际上可以理解为计算机在执行运算时总会自己验算的.

当然校验也有可能同时错掉了, 这也是无法避免的, 但是发生这样的事情的几率就会少得非常非常多.
oldwatch是个方家啊,嘿嘿
ECC内存阿,RECC内存阿。
等等很多软硬件的措施都是为了防止ls说的这种意外错误(不是误差)的。

极端点,像电传系统,会多套做裁决系统的。少数服从多数。
原帖由 chinayx 于 2009-2-3 12:51 发表



有限十进制转化为二进制哪里来的误差。不要跟计算机内位数限制扯在一起

你给我表示一个0.2:D 。
原帖由 jiandingzhe 于 2009-2-3 14:59 发表

你给我表示一个0.2:D 。


能用BigDecimal类型么?

:D
原帖由 oldwatch 于 2009-2-3 15:02 发表


能用BigDecimal类型么?

:D

不行[:a11:]
不过BigDecimal是什么样的?用整数表示小数?还是直接用字符串?
反正java的BigDecimal是一个BigInteger再加一个字段记录小数点位置,而BigInteger是一个int数组