我必须能够使用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);
}
如果在排序上述矢量时有更好的产生负零的方法,请告知。 非常感谢!
答案 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(符号位)