2015-12-01 4 views
13

У меня есть номер с плавающей запятой a и b. Я хочу проверить, есть ли у них разные знаки. Легкий способ - посмотретьЛюбой простой способ проверить, имеют ли два номера разные знаки?

bool b = a * b < 0; 

Но эти два номера очень маленькие, а * 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? чтобы компилятор не переупорядочил его, вы можете создать noinline-функцию no_reorder, которая просто возвращает свой аргумент, а затем используйте no_reorder (a * 1e20f) * b. или просто введите одно число в двойное (если оно еще не указано) –

ответ

7

Вы можете использовать std::signbit следующим образом:

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

LIVE DEMO

Другой способ заключается в использовании std::copysign следующим образом:

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

неточно для проверки * 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

Другим решением является:

BOOL с = ((0> a) == (0> b));