2017-03-16 24 views
-2

浮動小数点2つの不等式の値を比較したいC++/CUDAコードがあります。私のコードの目的は、メモリを共有しているカップルのプロセスの間にいくつかの基本的なハンドシェイクを実装することです浮動小数点数を等価/不等号と比較する

float2 cond = {1,0} 
float2 *array = ... 

while (array[0] != cond) 
{ 
    Code... 
} 

:基本的に、私はの線に沿って何かを必要としています。配列の値の1つを準備フラグとして使用したいので、その値を監視したいと思います。プロセス間でハンドシェークを実装する方法は他にもありますが、すでに実装されているコードに多くの変更を加えることなく実装する必要があります。

注:他の人が指摘しているように、浮動小数点を直接比較することは決して良い考えではありません。しかし、私の場合は、問題の要素に操作が適用されないので、何の問題もないはずです。将来的に私はよりよい解決策に取り組むつもりですが、私の現在の制約の下では、これで十分です。このような

+1

これに浮動小数点値を使用すると、私にとっては特に悪い考えです。 – talonmies

+0

私はそれを理解しています。比較される要素のいずれにも操作は適用されないので、問題ではありません。発生するのは、{1,0}または{0,0}に設定されることだけです。無限のオプションがあることは分かっていますが、私は今、残念な制約の下で作業しています。 – Kevin

答えて

3

何か作業をする必要があります:

float2 cond; 
cond.x = 1; cond.y = 0; 
float2 *array = (float2 *)malloc(array_len*sizeof(float2)); 
// initialize array values, for example: 
array[0].x = 0; 
array[0].y = 0; 

while ((array[0].x != cond.x) || (array[0].y != cond.y)) 
{ 
    Some code... 
} 

私はこれは本当にCUDAとは何かを持っているとは思わないが、それはホストコードやCUDAデバイスのコードのいずれかに類似した方法で動作します。

おそらく、あなたはそれが何らかの直接の比較によって行うことができるかどうかを尋ねています。

array[0] != cond 

あなたが示したとおりです。追加の足場やフレームワークを追加しない限り、(構造体定義で定義された演算子を提供しないため)float2はできません。この追加の足場やフレームワークには、上記の例で示した線に沿った比較コードが含まれています。

最終的なコメントとして、浮動小数点数の等価性の比較は、通常はお勧めしません。通常、2つの量の差がある閾値よりも小さい場合、それらが「等しい」と判断することが推奨されます。しかし、それは本当にあなたの質問とは別の話題であり、おそらくあなたの "ハンドシェイク"ユースケースは、このモデルに適合しません。通常、数値/算術結果を「正しさ」と比較するときに使用されます。

関連する問題