Почему в стандартной библиотеке C нет равенства?

В стандартной библиотеке C есть: isgreater, isgreaterequal, isless, islessequal, islessgreater, isunordered. И почему в стандартной библиотеке C нет равенства? Это должно быть легко реализовать следующим образом:

bool isequal(float x, float y)
{
    return !isunordered(x, y) && isgreaterequal(x, y) && !isgreater(x, y);
}

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

Weather Vane 06.05.2024 18:57

@WeatherVane: Это не имеет отношения к этому вопросу. Эти макросы предназначены для облегчения упорядочивания, например, сортировки. Они не предназначены для проведения какого-либо «приблизительного» сравнения. Если бы в этих макросах предполагалось какое-то «приблизительное» сравнение, это затронуло бы их все, а не только isequal.

Eric Postpischil 06.05.2024 19:08

Возможность упорядочить вещи — это другой класс проблем, чем возможность проверить, совпадают ли два предмета.

Dúthomhas 06.05.2024 19:17

Я думаю, что в большинстве случаев вам не нужно, чтобы они были абсолютно равными, и вы не можете ожидать, что они будут точно равными. Вы можете просто увидеть такие случаи, как 0.03 + 0.01 + 0.02 != 0.03 + 0.02 + 0.01. В большинстве случаев то, что вы проверяете, если abs(d1 - d2) < epsilon

Savrona 06.05.2024 19:32

Я думаю, это потому, что эти макросы определены как «тихие» (не вызывающие исключений) аналоги обычных операторов отношений, в то время как == все равно молчит. Сказал, что есть функция iseqsig, предложенная библиотекой GNU, которая делает противоположное - ведет себя как ==, но выдает исключение: gnu.org/software/libc/manual/html_node/…

Eugene Sh. 06.05.2024 21:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В обосновании C99 V5.10 объясняется, что эти макросы были добавлены в язык с единственной целью обеспечить безопасность и не вызывать исключений с плавающей запятой, как это могли бы делать соответствующие операторы:

Операторы отношения (<, <=, >=, >), но не операторы равенства (== и !=), может вызывать исключения с плавающей запятой, когда одним из операндов является NaN (как индикатор ошибки для программ, написанных без учета NaN). Существует потребность в сравнениях, которые гарантированно [sic] не вызовут каких-либо исключений с плавающей запятой; это также является требованием [sic] стандарта IEC-60559. Вот почему isgreater, isgreaterequal, isless, islessequal, Были изобретены макросы islessgreater и isunordered, похожие на функции.

Я знаю, почему сейчас нет равенства. И я проверяю, что это действительно работает (как побочный эффект): bool isequal(float x, float y) { return !isunordered(x, y) && isgreaterequal(x, y) && !isgreater(x, y); }

gsm 08.05.2024 14:36

Другие вопросы по теме

Представление чисел с фиксированной запятой
Почему Pythons sum() и Pandas sum() дают разные результаты
Могу ли я усечь 10-байтовое «расширенное» число и преобразовать его в 8-байтовое двойное число?
Как вручную преобразовать шестнадцатеричное представление fprintf с плавающей запятой в десятичное
Использовать массив длиной 2 или использовать объект для переноса двух чисел с плавающей запятой для повышения эффективности?
Почему я получаю разные результаты, когда при кодировании возведения в степень использую значения или переменные?
Является ли IEEE умножение на степень двойки ассоциативным?
Работа с переполнением и опустошением при умножении целых чисел и чисел с плавающей запятой
Можно ли представить -3/32 как двоичное значение с плавающей запятой, используя только 7 бит?
Как сложение чисел с плавающей запятой работает в «np.finfo(np.float64).max + 1»?