软件工程第一周——Ariane

Ariane 5是欧洲航天局的一款火箭,1996年其首次发射失败,原因是一个与浮点数溢出相关的软件错误。为了理解这个问题和它的解决方法,我们可以用一个简化的方式来解释。

1. 背景知识

   - 浮点数:在计算机中,我们使用浮点数来表示小数。这种数有一个尺度因子,允许它的小数点在数中“浮动”。

   - 溢出:当一个数太大或太小而无法被计算机的特定数据类型表示时,会发生溢出。例如,如果你尝试将一个非常大的数存储在一个只能保存小数的变量中,就会发生溢出。

2. Ariane 5问题的起因

   Ariane 5的导航系统需要进行速度计算。这些计算生成的结果是64位浮点数。(其中的原因老师曾言是关于火箭质量增加,加之各种原因导致的速度增大)但是,由于与Ariane 4共享的遗留代码,这些结果被转换为16位整数。在火箭加速到超过Ariane 4的速度时,这个数变得太大,导致16位整数溢出

3. 解决方案

3.1 修复浮点数溢出错误

确保所有数值计算都使用足够的范围和精度。这意味着要使用适当大小的数据类型来存储和操作数值。在Ariane 5的情况下,遗留代码中的16位整数转换应该被删除或替换为更大的数据类型。

那么,具体是如何进行转换的呢?

(1) 确定新的数据类型

首先,要确定一个可以包含所有预期数据的数据类型。在此情况下,64位浮点数提供了足够的范围和精度,但将它转换为16位整数显然是不合适的。因此,转换成一个更大的整数(例如32位或64位)或直接使用浮点数都是更好的选择。

(2) 代码修改

在代码中,所有16位整数的声明和与其相关的计算都需要修改。例如,如果原代码是这样的:

short velocity; // 16-bit integer

它可以被修改为:

   double velocity; // 64-bit floating point

   long long velocity; // 64-bit integer

(3) 更新相关操作

与该变量相关的所有操作(如算术运算、函数调用参数和返回值等)都应进行检查和必要的修改,以确保它们与新的数据类型兼容

扩展:修复过程中,底层需求与变化是什么?

(1) 存储需求

新的数据类型可能需要更多的内存。例如,64位整数或浮点数需要的存储空间是16位整数的四倍。这可能会影响到内存使用、数据缓存和数据传输。

(2) 性能考虑

使用更大的数据类型可能会影响性能,尤其是在涉及大量数值计算时。某些操作在浮点数上可能比整数慢,或者64位整数操作可能比16位整数慢。

(3) 硬件和指令集

如果硬件优化了特定大小的数据类型的操作,那么更改数据类型可能会使得这些优化失效。现代通常的硬件会自动进行优化,所以不需要过多关注。但是涉及到军工,就一定要重新添加人工优化硬件的过程。

(4) 测试和验证

当更改数据类型时,重要的是进行全面的测试,以确保没有引入新的错误,并验证修改后的代码的正确性。

3.2 增加数据精度检查

在进行数值计算之前,检查数值是否在有效范围内。例如,如果一个计算预期产生一个0到100之间的结果,但实际产生了105,那么这明显是一个错误,应该引发一个错误或警告。

3.3 纠正数据

如果发现数据不在预期范围内,可以尝试纠正它。例如,如果一个速度计算返回了一个负数,但速度不可能是负数,那么可以将其设置为0。

解决Ariane 5的问题需要识别和修复与数据类型和计算相关的错误,确保所有计算都在预期的范围和精度内进行。这包括使用正确的数据类型、检查数据范围和纠正无效数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Joy T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值