【问题标题】:Sorting between signed and unsigned zeros c++在有符号和无符号零之间排序c ++
【发布时间】:2016-02-07 22:40:44
【问题描述】:

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

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

【问题讨论】:

  • 能否提供minimal reproducible examplexy 的具体类型是什么?
  • x 和 y 是如何定义的?
  • 我有理由相信,标准的 C++ 没有定义什么给出负零,它是一个实现细节,硬件实际上是否有负零。换句话说,代码的结果以及是否生成负零取决于编译器和目标处理器。

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


【解决方案1】:

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

在这种情况下,表达式

y = y - 0.0;

仅当 y == -0.0 该分配或您将舍入模式设置为 “向 -INFINITY 舍入” 时才会产生 -0.0,这通常是您获胜的不。

要实际生成具有值-0.0double,您只需分配所需的值:

double d = -0.0;

现在 d == -0.0 在 IEEE 浮点数学中。

然而,作为

比较应忽略零的符号

(IEEE 754-1985, 5.7. 比较),-0.0 &lt; 0.0 将产生false,所以如果你真的想在正零之前排序负零,你需要编写自己的比较器,可能使用std::signbit .


附录:相关标准引用:

当两个符号相反的操作数之和(或两个之差 具有相似符号的操作数)正好为零,该和(或差)的符号 在所有舍入模式下都应为 +,但向 –INFINITY 舍入除外,其中 标志的模式应该是-。

IEEE 754-1985, 6.3(符号位)

【讨论】:

    猜你喜欢
    • 2013-04-06
    • 2011-11-02
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多