с плавающей запятой — различают ноль и отрицательный ноль Переполнение стека

Я столкнулся с ситуацией в моем коде, когда функция возвращает значение типа double, и возможно, что этот тип double будет нулем, отрицательным нулем или другим значением полностью. Мне нужно различать ноль и отрицательный ноль, но двойное сравнение по умолчанию не делает. Из-за формата двойных чисел C ++ не позволяет сравнивать двойные с использованием побитовых операторов, поэтому я не уверен, как действовать дальше. Как я могу различить два?

7

Решение

Вызов std::signbit() определить состояние знакового бита.

15

Другие решения

Из-за формата двойных чисел 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 приводит к соответствующим бесконечностям.

7

Чтобы явно проверить наличие == -0 в C, сделайте следующее:

if (*((long *)&a) == 0x8000000000000000) {
//  a is -0
}
0
По вопросам рекламы [email protected]