2016-02-07 4 views
-3

Я должен иметь возможность сортировать отрицательные нули и нули для задания, которое я делаю в университете, используя 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

Можете ли вы предоставить [MCVE]. Каковы типы 'x' и' y' на самом деле? –

+2

Как определяются x и y? – cen

+0

Я уверен, что C++ по стандарту не определяет, что дает отрицательный ноль, и это детализация реализации, действительно ли аппаратное обеспечение имеет отрицательный ноль или нет. Другими словами, результат вашего кода и генерируется ли отрицательный ноль или нет, зависит от компилятора и целевого процессора. –

ответ

4

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

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

y = y - 0.0; 

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

Чтобы на самом деле производит 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 (знаковый бит)

Смежные вопросы

 Смежные вопросы