2016-07-21 3 views
0

Простой способ для диапазона (A, B)Как проверить float в диапазоне в C++?

if (A < X && X < B) ... 

Но, похоже, + INF, .NAN также лежит в диапазоне

+0

Что такое 'A, B, X'? все плавает? как вы можете выбрать A и B, чтобы внутри INF? – user463035818

+1

Значит ли _Diapason_ _Interval_? – Aganju

+0

Все числа являются поплавками, диапазон интервалов –

ответ

2

Ваше состояние не является интервалом (камертон). Он функционально эквивалентен

X < std::min(A, B) 

У вас есть только верхняя граница, без нижней границы.


Точно, как NaN и + Inf себя, зависит от представления с плавающей запятой, которое не определено в стандарте С ++, но процессор специфичны.

Если мы предполагаем, что обычно используется IEEE-754, то ни X = + Inf, ни X = NaN не может удовлетворять условию при любых значениях А и В.


Это, как вы убедитесь, что число с плавающей точкой находится между нижним и верхней границей (но равно ни):

X > low && X < high 

или

low < X && X < high 

Опять же, если мы предположим, что IEEE-754, то ни X = + Inf, ни X = NaN не могут удовлетворять этому условию для любых значений низкого и высокого. Но, поскольку IEEE-754 может быть не гарантировано, поведение таких чисел не указывается. Возможно, вам необходимо быть явным для поддержки экзотического оборудования:

low < X && X < high && std::isfinite(X) 
+1

Некоторые люди также считают, что 'low X' не имеет смысла. – Groo

+0

@Groo хороший момент о возможно быть опечаткой. Я добавил уточнение, что в IEEE-754 условие не удовлетворено ни Inf +, ни NaN, когда интервал записывается правильно. – user2079303

Смежные вопросы