问答题 1991年2月25日,海湾战争中,美国在沙特阿拉伯的达摩地区设置了爱国者导弹,用以拦截伊拉克的飞毛腿导弹,结果失败了,致使飞毛腿导弹击中了美国的一个兵营,造成28名士兵死亡。拦截失败的原因是由于一个浮点数的精度问题造成的。爱国者导弹系统中有一个内置时钟,用计数器实现,每隔01s计数一次。程序用0.1乘以计数器的值得到以秒为单位的实际。0.1的二进制表示是一个无限循环序列:0.00011[0011]B(方括号中的序列是重复的)。请问:
问答题 假定用一个类型为float的变量x来表示0.1,则变量x在机器中的机器数是什么(要求写成十六进制形式)?绝对值|x-0.1|的值是什么(要求用十进制表示)?
【正确答案】0.1=0.0 0011[0011]B+1.1 0011 0011 0011 0011 0011 00B×2-4,float类型采用IEEE 754。
单精度浮点数格式见表1。
{{B}}表1 float类型采用IEEE 754单精度浮点数格式{{/B}}
符号位 阶码 尾数 总位数
占1位 占8位 占23位 占32位
符号位s为0,阶码e=127-4=123=0111 1011B,尾数的小数部分为0.1001 1001 1001 1001 1001 100B,因此,在机器中float型变量x表示见表2。
{{B}}表2 float型变量x表示{{/B}}
符号位 阶码 尾数
0 0111 1011 1001 1001 1001 1001 1001 100
即0011 1101 1100 1100 1100 1100 1100B,用十六进制表示为3DCC CCCCH。由于float类型的精度有限,只有24位有效位数,尾数从最前面的1开始一共只能表示24位,后面的有效数字全部被截断,故x与0.1的误差为|x-0.1|=0.000 0000 0000 0000 0000 0000 0000 110011100]B。该值约等于0.11B×2-27,大约为5.59×10-9
【答案解析】
问答题 爱国者系统启动时计数器的初始值为0,并开始持续计数。假定当时系统运行了200h,则程序计算的时间和实际时间的偏差为多少?如果爱国者根据飞毛腿的速度乘以它被侦测到的时间来预测位置,若飞毛腿的速度为2000m/s,则预测偏差的距离为多少?
【正确答案】爱国者系统运行200个小时后,共计数200×3600×10=72×105次。因此,程序计算的时间和实际时间的偏差约为5.59×10-9×72×105=0.0402s。预测偏差距离约为2000m/s×0.0402s=80.4m。
【答案解析】