2015-12-01 2 views
13

私は2つの浮動小数点数abを持っています。彼らのサインが違うかどうかチェックしたい。簡単な方法は見てみる2つの数字に異なる符号があるかどうかを調べる簡単な方法はありますか?

bool b = a * b < 0; 

しかし、2つの数値は非常に小さく、a * bはアンダーフローである可能性があります。それを確認する他の簡単な方法?

誰でも重複していると思う人は、私には条件a * b < 0と正確に一致する回答をください。ここで、0の符号は私の質問では定義されていないことに注意してください。

+4

C++ 11には[signbit](http://en.cppreference.com/w/cpp/numeric/math/signbit)があります。だから、何か 'signbit(a)== signbit(b)'はどちらも同じ符号を持つことになります。 – wendelbsilva

+0

fwiw、vs2012はsignbitを持っていないようです。 2013年もそうです。 1e20fのように1つの数字に大きな数字を掛けることはできませんか?コンパイラーが順序を変更しないようにするには、引数を単に返すnoinline関数no_reorderを作成し、no_reorder(a * 1e20f)* bを使用します。 または、1つの数値をdoubleにキャストするだけです(まだない場合) –

答えて

7

次のようにあなたがstd::signbitを使用することができます。

bool c = std::signbit(a) == std::signbit(b); 

LIVE DEMO

もう一つの方法は、次のようにstd::copysignを使用することです:

bool c = std::copysign(a,b) == a; 
+0

は、a * b <0を確認するには正確ではありません。aとbも0にすることができます。 (1)a = 1、b = 0(2)a = -1、b = 0両方を偽とする。 – user1899020

+0

@ user1899020あなたの質問が正しいとすれば、 'signbit'と' copysign'の両方がゼロ、無限大、NaNの符号ビットを検出します。 – 101010

+0

@ user1899020 aとbは、「高速チェック」の副作用として偽である必要がありますが、違う記号については偽であることを意味しません。 – Slava

0

別の解決策は次のとおりです。

ブールC = ((0> a)==(0> b));

関連する問題