用单精度浮点模拟双精度算术
在浮点功能有限的嵌入式系统领域,出现了这种需求使用单精度数据结构模拟双精度数据结构。本文解决了使用单精度浮点对实现双精度加法和比较运算的挑战。
比较
比较两个模拟的双精度值是一件简单的事情。我们采用字典顺序,按顺序比较元组元素。 (d1.hi > d2.hi) OR ((d1.hi == d2.hi) AND (d1.low > d2.low))
加法
模拟双精度加法被证明更加棘手。我们需要确定要使用的基数和检测进位的方法。
基数选择
FLT_MAX 是不合适的基数,因为它会引入不必要的上溢和下溢问题。相反,我们采用指数范围较大但精度较低的浮点格式,称为“双浮点”。
进位检测
令 d1 和d2 是要相加的两个模拟双精度值。我们首先对 d1.hi 和 d2.hi 求和:
result.hi = d1.hi + d2.hi
如果 result.hi 溢出,我们就知道有进位。在本例中,我们将 result.hi 减 1,并将 result.low 加 1。如果 result.hi 下溢,我们将其加 1 并从 result.low 中减去 1。
if (result.hi overflowed) { result.hi--; result.low++; } else if (result.hi underflowed) { result.hi++; result.low--; }
然后将 d1.low 和 d2.low 添加到 result.low:
result.low += d1.low + d2.low
如果 result.low 溢出,我们将 result.hi 加 1。如果下溢,我们将 result.hi 减 1。
if (result.low overflowed) { result.hi++; } else if (result.low underflowed) { result.hi--; }
最后,我们使用 (result.hi 返回模拟的双精度结果, result.low)。
这种方法基于 Dekker 和 Kahan 的工作,使我们能够在受限于单精度算术的环境中以合理的精度和效率模拟双精度加法。
以上是如何在嵌入式系统中使用单精度浮点数来模拟双精度加法?的详细内容。更多信息请关注PHP中文网其他相关文章!