単精度浮動小数点を使用した倍精度演算のエミュレーション
浮動小数点機能が制限された組み込みシステムの領域では、次のようなニーズが生じます。単精度データ構造を使用して倍精度データ構造をエミュレートします。この記事では、単精度浮動小数点数のペアを使用して倍精度の加算と比較演算を実装するという課題に取り組みます。
比較
エミュレートされた 2 つの double 値の比較は簡単です。 。辞書編集的な順序付けを採用し、タプル要素を順番に比較します。 (d1.hi > d2.hi) OR ((d1.hi == d2.hi) AND (d1.low > d2.low))
加算
倍精度加算をエミュレートするのは難しいことがわかります。使用するベースとキャリーを検出する方法を決定する必要があります。
ベース選択
FLT_MAX は、望ましくないオーバーフローとアンダーフローの問題を引き起こすため、不適切なベースです。代わりに、「double-float」と呼ばれる、より大きな指数範囲を持つが精度が低下した浮動小数点形式を採用します。
キャリー検出
d1 とd2 は、追加される 2 つのエミュレートされた double 値です。まず、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--; }
最後に、エミュレートされた double の結果を (result.hi) で返します。
この方法論は、Dekker と Kahan の研究に基づいており、単精度演算に制約された環境で、妥当な精度と効率で倍精度加算をエミュレートすることができます。
以上が組み込みシステムで単精度浮動小数点を使用して倍精度加算をエミュレートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。