Я должен быть в состоянии сортировать отрицательные нули и нули для задания, которое я делаю в университете, используя 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);
}
Если есть лучший способ получения отрицательного нуля при сортировке указанного вектора, пожалуйста, сообщите об этом.
Большое спасибо!
Прежде всего, в стандарте 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 (бит знака)
Других решений пока нет …