Подтвердить что ты не робот

Когда использовать функции сравнения поплавка C?

В последнем стандарте С++ я заметил следующие макросы:

bool isgreater(float x, float y);
bool isgreaterequal(float x, float y);
bool isless(float x, float y);
bool islessequal(float x, float y);
bool islessgreater(float x, float y);
bool isunordered(float x, float y);

Эти макросы взяты из C (7.12.14 и 7.12.14).

Итак, зачем кому-то использовать эти макросы, а не операторы? Есть ли что-то особенное, что делают эти макросы (например, проверка на inf), или они такие же, как их соответствующий оператор?

Пример С++:

#include <iostream>
#include <cmath>

int main()
{
  float x=0.2;
  float y=0.5;
  std::cout << x << " < " << y << " : " << std::boolalpha << std::islessequal( x, y ) << std::endl;
  std::cout << x << " < " << y << " : " << std::boolalpha << ( x <= y ) << std::endl;
}
4b9b3361

Ответ 1

В отличие от реляционных операторов, эти макросы действительно возвращают только логическое значение и никогда не поднимают исключение с плавающей запятой.

Короче: вам нужно иметь дело только с true/false и больше ничего.


ссылки:

Описание Open Group (а не стандарт C или С++, но очень актуальный в мире Unix/Linux и почти всегда аналогичный стандартам):

Стандарт С++:

C Library [c.math]:

Функции классификации/сравнения ведут себя так же, как макросы C с соответствующими именами, определенными в 7.12.3, макросами классификации и 7.12.14, макросами сравнения в стандарте C. Каждая функция перегружена для трех типов с плавающей точкой, как показано ниже [...]

C стандарт:

7.12.14 Макросы сравнения

[...] Для любой упорядоченной пары числовых значений точно одна из отношения - меньше, больше и равно - верно. Реляционные операторы могут поднять '' Недопустимое исключение с плавающей запятой, когда значения аргумента являются значениями NaN. Для NaN и числовое значение или два NaN, только неупорядоченное отношение истинно. Следующие подпункты предоставляют макросы, которые являются тихими (не с плавающей точкой исключением) версиями реляционных операторов и другими макросами сравнения, которые облегчают написание эффективного кода, который учитывает NaN, не перенося "недопустимое исключение с плавающей точкой" . В синоптики в этом подпункте, real-floating указывает, что аргумент должен быть выражение реального плавающего типа.

Ответ 2

isgreater et al. были включены в С++ 11 из C99. Они определены, чтобы не повышать недопустимое исключение с плавающей запятой, когда x и/или y сигнализируют значения NaN.

Обоснование:

Этот макрос представляет собой тихую (невалютную точку исключения) версию реляционного оператора. Это облегчает написание эффективного кода, который учитывает NaN, не испытывая недопустимого исключения с плавающей запятой.

Числовое значение макроса на NaN такое же, как всегда; Значения NaN сравнивают значение false со всеми другими значениями, включая значения NaN во всех реляционных операциях и новых макросах.