Сортировка между знаковыми и беззнаковыми нулями 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 (бит знака)