Могу ли я получить поведение -Wfloat-equal для всех сравнений, кроме буквального нуля? - PullRequest
5 голосов
/ 26 февраля 2011

Я бы хотел включить -Wfloat-equal в моих параметрах сборки (это флаг GCC, который выдает предупреждение, когда два числа с плавающим указателем сравниваются с помощью операторов == или! =).Тем не менее, в нескольких заголовочных файлах библиотек, которые я использую, и в хорошей части моего собственного кода, я часто хочу переходить к ненулевым значениям типа float или double, используя if (x) или if (x != 0) или их варианты.

Поскольку в этих случаях я абсолютно уверен, что значение точно равно нулю - проверенные значения являются результатом явной инициализации нуля, calloc и т. Д. - я не вижу недостатка в использовании этого сравнения, скореечем значительно более дорогой и менее читаемый вызов моей функции near(x, 0).

Есть ли способ получить эффект -Wfloat-equal для всех других видов сравнений равенства с плавающей запятой, но разрешить их пропускать без пометок?В заголовочных файлах библиотек их достаточно, чтобы они могли сильно загрязнить вывод моих предупреждений.

Ответы [ 3 ]

3 голосов
/ 26 февраля 2011

Из вопроса, который вы задаете, кажется, что предупреждение совершенно уместно. Если вы сравниваете с точным нулем для проверки того, что данные все еще имеют начальное нулевое значение от calloc (что на самом деле неверно с точки зрения чистого C, но работает на любой реализации, соответствующей стандарту IEEE 754), вы можете получить ложные срабатывания от ненулевые значения были округлены до нуля. Другими словами, похоже, что ваш код неверен.

2 голосов
/ 07 апреля 2012

Это довольно ужасно, но это избегает предупреждения:

#include <functional>

template <class T>
inline bool is_zero(T v)
{
    return std::equal_to<T>()(v, 0);
}

GCC не сообщает о предупреждениях для системных заголовков, и это вызывает проверку на равенство внутри системного заголовка.

0 голосов
/ 26 февраля 2011
...