double 类型的数是不是不能精确赋值

由于计算机的字长是有限的,所以有些值确实没法精确表示。就像十进制下1/3没法有有限长度表示一样。

可以用整数循环解决。

浮点数的精度控制不好可是会死人的。请看:“1991年2月25日,一杖伊拉克飞毛腿导弹击中了沙特阿拉伯载赫蓝的一个军营,杀死了美国陆军第十四军需分队的28名士兵。政府调查指出该次失败归咎于导弹系统时钟内的一个软件错误。在此之前,爱国者导弹连在载赫蓝已经连续工作了100小时。至此,导弹的时钟已经偏差了三分之一秒,相等于600米的距离误差。”–引自百度百科。

具体原因是,爱国者导弹内部用整数计数器来表示经过多少时间步长,可是却作死的选择了0.1秒这个没法被2进制有限表示的时间步长。爱国者内部的字长24位。内部软件在计算当前时间的时候,是用计数器乘以0.1秒的计算方法。这样的话,每经过一个时间步,误差大概为(可以自行用2进制求得) 。所以运行100小时候的误差为0.3433秒,没能拦截飞毛腿。

实际情况其实更复杂一点,因为按理说导弹的误差应该依赖于两次读数的相对误差而不是一次读数和绝对时间的误差。这其实是因为,爱国者的导弹软件改过很多次,后来已经有高精度误差更小的时钟了,但是由于导弹软件太复杂,有些对老代码的引用没有完全替换成新的。这样导弹一次读了高精度时钟,没有误差,另一次读了有误差的老时钟,运行100小时后的他们的相对误差就会达到三分之一秒。

处理浮点数误差除了判断相等的时候用一个之外,极端点的,可以用CGAL库的方法,强行把所有输入转换成高精度分数来确保算法结果正确。当然,具体情况还需具体分析,比如很多矩阵算法的收敛性得加入特殊的步骤。

http://www.45zq.cn/portal/article/index/id/165.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值