質問

私は最近読んだもにIEEE754のx87ます。えるNaNとしての"欠損値"の一部の数値計算コードのように、つくろうと思いましたその利用 シグナル伝達 NaNがよく浮動小数点例外の場合いを進めて明らかとなっています。 逆に、混雑して待たされること 静かな NaNの"欠損値"の伝搬を計算である。しかし、シグナル伝達NaNs働いていないと思うの()書類存在する。

この概要かい(すべての利用x87、VC++):

  • _EM_INVALID(IEEE"無効"の例外での挙動のx87たとき、切羽詰まったときにNaNs
  • ま_EM_INVALIDクの例外では無効)は、例外が生成され、業務に復帰できる静かなものがあります。操作を伴うシグナルを発生するNaNま ない 例外がスローされ、変換されまする閑静なものがあります。
  • ま_EM_INVALIDはステルス迷彩を除可能)が無効な操作(例えば、sqrt(-1))の原因となる無効な例外がスローされます。
  • のx87 ない 発生シグナルのものがあります。
  • ま_EM_INVALIDはステルス迷彩, 他の 利用のシグナルを発生するNaNで初期化変数とする無効な例外がスローされます。

の標準ライブラリを提供へのアクセスのNaN値:

std::numeric_limits<double>::signaling_NaN();

std::numeric_limits<double>::quiet_NaN();

問題は見かけな利用については、一切のシグナルのものがあります。ま_EM_INVALIDは仮面での動作と同じで静かなものがあります。からないNaNが他のどNaNが論理的ます。

場合は_EM_INVALID ない 仮面(例外は有効にしませんで変数の初期化には、シグナルを発生するNaN:double dVal = std::numeric_limits<double>::signaling_NaN(); この例外がスローのシグナルを発生するNaN値が読み込まれるx87登録店舗でのメモリアドレス)

い、以下のとなった:

  1. マスク_EM_INVALID.
  2. 初期化の可変シグナルのものがあります。
  3. Unmask_EM_INVALID.

しかし、ステップ2の原因になシグナルを発生するNaNに変換する静かなNaN、その後の利用で ない 原因の例外がスローされ!で何?!

はありま態や目的には一切をシグナルを発生するNaN?私の意図した初期化メモリのように使用unitialized浮動小数点の値とする。

で誰か教えてくだ何かが足りない。


編集:

さらに明らかにしたいことを、ここでは一例です:

る数学的操作のベクトルデータ(double).一部の業務にたいするベクトルに含まれる"欠損値"(ふりこれに対応するスプレッドシートの列、例えば、細胞のない価値が、その存在は大幅).業では、 ない ためのベクトルに含まれる"欠損値とします。" もしかしたいなどとは全く異なるコースの場合には、"欠損値"の設定は不良異なる操作(このような無効な状態にする。

この独自のコードを見て思ったこと。

const double MISSING_VALUE = 1.3579246e123;
using std::vector;

vector<double> missingAllowed(1000000, MISSING_VALUE);
vector<double> missingNotAllowed(1000000, MISSING_VALUE);

// ... populate missingAllowed and missingNotAllowed with (user) data...

for (vector<double>::iterator it = missingAllowed.begin(); it != missingAllowed.end(); ++it) {
    if (*it != MISSING_VALUE) *it = sqrt(*it); // sqrt() could be any operation
}

for (vector<double>::iterator it = missingNotAllowed.begin(); it != missingNotAllowed.end(); ++it) {
    if (*it != MISSING_VALUE) *it = sqrt(*it);
    else *it = 0;
}

なお、チェックのための"欠損値"を明記してください 毎ループの繰り返し.を理解している場合は、 sqrt 機能(その他の数学的操作がovershadowこのチェックしているが、場合によって動作を最小限のものだけで追加のチェックは多額のコストがかかります。はもちろんのこと、"欠損値"は法入力値の遊びなどを起こす可能性がありバグの場合の計算法に到達する値がない)になります。も技術的に正しいユーザの入力データに対してチェックする必要のあるその価値の適切な対応が必要とされます。見本ソリューションinelegantり最適な性能ました。これは性能を重視したコードを絶対にしない贅沢を並列データ構造やデータ要素のオブジェかの並べ替えができます。

のNaN版のようになります:

using std::vector;

vector<double> missingAllowed(1000000, std::numeric_limits<double>::quiet_NaN());
vector<double> missingNotAllowed(1000000, std::numeric_limits<double>::signaling_NaN());

// ... populate missingAllowed and missingNotAllowed with (user) data...

for (vector<double>::iterator it = missingAllowed.begin(); it != missingAllowed.end(); ++it) {
    *it = sqrt(*it); // if *it == QNaN then sqrt(*it) == QNaN
}

for (vector<double>::iterator it = missingNotAllowed.begin(); it != missingNotAllowed.end(); ++it) {
    try {
        *it = sqrt(*it);
    } catch (FPInvalidException&) { // assuming _seh_translator set up
        *it = 0;
    }
}

現在は、明示的なチェックを消去性能を向上させることが必要である。るものと思われている場合、私の初期化ベクターに触れることなくFPUレジスタ...

また、この他自己の尊重 sqrt 実施のチェックNaNを返しますNaNます。

役に立ちましたか?

解決

私の理解では、その目的のシグナルを発生するNaNを初期化データ構造ですが、もちろん ランタイム 初期化Cのリスクを有するNaN読み込まれるfloatとして登録の初期化をトリガ信号がコンパイラのないこのfloat値のニーズをコピーする整数値するものとする。

いただきますようお願いいえば初期化 static 値は、シグナルを発生するNaNものと必要とする特別な取り扱い、コンパイラによっては避けられるようになってい変静かなものがあります。きものを使用ビットの鋳造マジックは避けられるようになっていとして扱われるfloat値を設定する処理です。

また書ASMこならない、という考え方である。がCやC++では、と思いま覆すようなタイプシステムを初期化するために、変数のものがあります。であることを memcpy.

他のヒント

特殊な値もNULL)でデータを多くmuddier、コードで多くmessier.は不可能であると判断する一QNaN結果、QNaN"特別な"値です。

きの方が良いかもしれないの維持並列データ構造のトラックの有効性、または恐らくおFPデータを異なる(sparse)データ構造だけを保つ有効なデータです。

これはかなり一般のアドバイス特殊値のエネルギー変換機構について、一定の場合(例えばカスタマーサポート/よくメモリーや性能の制約しているとこが大きくないので原因があることがよい。

なんてconst uint64_tのビットが設定されていることで,そのシグナルを発生するnan?どんな治療としての整数タイプのシグナルを発生するnanが他の整数です。きくしたい場所をポインタ-鋳物

Const uint64_t sNan = 0xfff0000000000000;
Double[] myData;
...
Uint64* copier = (uint64_t*) &myData[index];
*copier=sNan | myErrorFlags;

に関する情報のためのビットセット:https://www.doc.ic.ac.uk/~eedwards/compsys/float/nan.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top