-3

我必须能够为我在大学使用 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);
    }

如果在对上述向量进行排序时有更好的方法产生负零,请告知。非常感谢!

4

1 回答 1

4

首先,标准 C++ 中不需要任何负零,所以我假设您正在谈论来自 IEEE-754 的负零,这是大多数(我从未遇到过异常)C++ 实现基于浮点数学的基础。

在这种情况下,表达式

y = y - 0.0;

-0.0仅当y == -0.0 该分配之前或将舍入模式设置为“向 -INFINITY舍入”时才会产生,而您通常不会这样做。

要实际生成double带有 value的 a -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(符号位)

于 2016-02-07T23:03:28.380 回答