在有符号和无符号零c ++之间进行排序

时间:2016-02-07 22:40:44

标签: c++ sorting bubble-sort unsigned-integer signed-integer

我必须能够使用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 个答案:

答案 0 :(得分:4)

首先,标准C ++中不需要任何负零,所以我假设你在谈论IEEE-754的负零,这是大多数(我从未遇到过例外)C ++实现基于它们的浮点数学上。

在这种情况下,表达式

y = y - 0.0;
只有在分配之前-0.0 或者您将舍入模式设置为“round to -INFINITY”时,

才会产生y == -0.0,你通常不会这样做。

要实际生成值为double的{​​{1}},您只需指定所需的值:

-0.0

IEEE浮点数学中的double d = -0.0;

然而,正如

  

比较应忽略零的符号

(IEEE 754-1985,5.7。比较),d == -0.0将产生-0.0 < 0.0,所以如果你真的想在正零之前排序负零,你需要编写自己的比较器,可能使用false

附录:相关标准报价:

  

当具有相反符号的两个操作数的总和(或两个的差异   具有相同符号的操作数)恰好为零,即该总和(或差异)的符号   在所有舍入模式中都应为+,除了向-INFINITY舍入外,其中   标志的模式应为 - 。

IEEE 754-1985,6.3(符号位)