Сортировка между знаковыми и беззнаковыми нулями C++

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

        cout << "Enter the number of elements you want to add to the vector:\n";
    cin >> x;
    cout << "Enter the integers: \n" << endl;
    for (int i = 0; i < x; i++)
    {
        cin >> y;
        y = y - 0.0;
        cout << y; 

        Array.push_back(y);
    }

Если есть лучший способ получения отрицательного нуля при сортировке указанного вектора, пожалуйста, сообщите об этом. Большое спасибо!

1 ответ

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

В этом случае выражение

y = y - 0.0;

даст -0.0 только если y == -0.0 перед этим заданием или если вы установите режим округления на "округление к -INFINITY", чего вы обычно не делаете.

На самом деле произвести double со значением -0.0Вы можете просто назначить желаемое значение:

double d = -0.0;

Сейчас d == -0.0 в IEEE математика с плавающей точкой.

Тем не менее, как

Сравнения должны игнорировать знак нуля

(IEEE 754-1985, 5.7. Сравнение), -0.0 < 0.0 даст false, так что если вы действительно хотите отсортировать отрицательный ноль до положительного нуля, вам нужно написать свой собственный компаратор, возможно, используя std::signbit,


Приложение: Соответствующая стандартная цитата:

Когда сумма двух операндов с противоположными знаками (или разность двух операндов с одинаковыми знаками) равна нулю, знак этой суммы (или разности) должен быть + во всех режимах округления, кроме округления до –INFINITY, в котором режим знак должен быть.

IEEE 754-1985, 6,3 (бит знака)

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