Я столкнулся с ситуацией в моем коде, когда функция возвращает значение типа double, и возможно, что этот тип double будет нулем, отрицательным нулем или другим значением полностью. Мне нужно различать ноль и отрицательный ноль, но двойное сравнение по умолчанию не делает. Из-за формата двойных чисел C ++ не позволяет сравнивать двойные с использованием побитовых операторов, поэтому я не уверен, как действовать дальше. Как я могу различить два?
Вызов std::signbit()
определить состояние знакового бита.
Из-за формата двойных чисел C ++ не позволяет сравнивать двойные с использованием побитовых операторов, поэтому я не уверен, как действовать дальше.
Во-первых, C ++ не требует какого-либо стандарта для float
/double
типы.
Предполагая, что вы говорите о IEEE 754 binary32 а также binary64 форматы, они специально предназначены для поддержания их порядка, когда их битовые комбинации интерпретируются как целые числа так что не-FPU может сортировать их; по этой причине у них есть предвзятый показатель.
Там вы много ТАК постов обсуждение таких сравнений; вот самый актуальный. Простая проверка будет
bool is_negative_zero(float val)
{
return ((val == 0.0f) && std::signbit(val));
}
Это работает с 0.0f == -0.0f
, хотя есть места, где знак имеет значение, как atan2
или когда деление на -0 в отличие от +0 приводит к соответствующим бесконечностям.
Чтобы явно проверить наличие == -0 в C, сделайте следующее:
if (*((long *)&a) == 0x8000000000000000) {
// a is -0
}