NANは、無効なパラメーターが計算に含まれていたことを伝えるのに適していますか?


9

私は現在、パフォーマンスが重要な環境に配備される数値処理システムに取り組んでいます。数値配列の形式で入力を受け取り(これらはeigenライブラリを使用しますが、この質問の目的では重要ではない可能性があります)、ある範囲の数値計算(行列積、連結など)を実行して出力を生成します。

すべての配列は静的に割り当てられ、そのサイズはコンパイル時にわかります。ただし、一部の入力無効な場合があります。これらの例外的な場合でも、コードを計算し、無効な値によって「汚染されない」出力を使用する必要があります。

例として、次の簡単な例を見てみましょう(これは疑似コードです)。

Matrix a = {1, 2, NAN, 4}; // this is the "input" matrix
Scalar b = 2;
Matrix output = b * a; // this results in {2, 4, NAN, 8}

ここでの考え方は、2、4、8は使用可能な値ですが、NANはデータの受信者に、そのエントリが無効な値を含む操作に関与していたことを通知し、破棄する必要があります(これは、std::isfinite(value)値を使用する前に確認してください)。

パフォーマンスが重要であり、ヒープ割り当てがオプションではない(そして、boost::optionalまたはポインターなどの他のリソースを消費する構成要素でもない)場合、これは使用できない値を通信および伝播する適切な方法ですか?

これを行うより良い方法はありますか?この時点で私は現在の設定に非常に満足していますが、現在の実装についていくつかの新鮮なアイデアや生産的な批評を得ることを望んでいました。


6
私見これは、非シグナリングNANのちょうど完璧なユースケースです。
david.pfx 2014

回答:


8

これは完全に合理的な方法です。NaNとして解釈される複数のビットマスクがあることにも注意してください。NaNには主に2つのタイプがあります。シグナリング(設定に応じて、作成時に例外をスローする可能性があります)とサイレント(実行しない)です。ただし、静かなNaN内でも、静かなNaNに対応する複数のビットマスクがあります。本当に使いたい場合は、通常のNaNとは異なる独自のNaNを作成できます。たとえば、NA(NaNとは異なる概念)に対応する特定のビットパターンを使用できます。

公害についてのあなたのポイントも。これはかなりトリッキーになります。一般に、NaNを含む数学演算はNaNになります。つまり、NaNは伝染性です。場合によっては、これで十分です。他では、そうではありません。たとえば、与えたベクトルの平均を求められたとします。NaN、それとも7/3ですか?ただし、指定したスカラー*ベクトル積は希望どおりに機能し、std::isfiniteチェックを行う必要もありません。数値を乗算するだけでNaNが自動的に表示されるので、非常に高いパフォーマンスを発揮します。しかし、ベクトルに対して平均7/3を取得したい場合は、より賢くする必要があります。単純に行うとNaNになるためです。これを高速に実装する方法を説明することはできませんが、numpyにはその1つとオープンソースがあるため、これを見ることができます。


1

浮動小数点モデルを修正し、NaNセマンティクスを使用している限り、私には問題ありません。

IEEE 754で十分です。

http://en.m.wikipedia.org/wiki/Single-precision_floating-point_format

/programming/5777484/how-to-check-if-c-compiler-uses-ieee-754-floating-point-standard


2
これらの各リソースの内容について少し詳しく説明してもらえますか。また、質問に答える際にこれらを推奨する理由を教えてください。「リンクのみの答えは」かなりスタック所で歓迎されていません
ブヨ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.