用單精度浮點模擬雙精度算術
在浮點功能有限的嵌入式系統領域,出現了這種需求使用單精度資料結構模擬雙精度資料結構。本文解決了使用單精度浮點對實現雙精度加法和比較運算的挑戰。
比較
比較兩個模擬的雙精確度值是一件簡單的事情。我們採用字典順序,依序比較元組元素。 (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中文網其他相關文章!