0

我想创建一个循环链表,我需要在其中找到最大值和最小值,所以我需要一些检查点来停止,我想在第一个元素中使用 -0 来做到这一点(它只是一个检查点而不是其他任何东西)。我不想使用任何其他值,因为用户可以将新数据输入到列表中,如果用户输入 -0,我将简单地将其替换为 0,因为从数学方面来看,它们之间没有区别(我不会永远使用 -小数字:) )。我使用整数值。

问题现在没有利润。我试了一下,结果是一样的:

#include <iostream>

using namespace std;

int main() {
    if(0 != -0){
        cout << "they are different!";
    }else{
        cout << "they are same";
    }

    return 0;
}

谢谢大家。

4

4 回答 4

3

与数学一样0-0它们的值相同。您无法以任何方式区分它们,因此您可以在描述时使用此条件。

于 2013-04-01T14:31:11.200 回答
2

几乎通用的二进制补码系统中的整数值不能为负零 - 它们没有表示形式。负零根本不存在。

IEEE 浮点数可能会出现负零,但不会经常出现。将负数乘以 0.0 即可。

我建议找到另一个哨兵值。

于 2013-04-01T14:42:59.830 回答
1

This would require you store ints as doubles, mind. But you could do something like this.

signbit probably does the trick. If not, try taking the reciprocal. 1/+0.0 = +inf, 1/-0.0 = -inf. As a last ditch effort, do something like:

double d=-0.0;
bool is_neg = (*(uint64_t*)&d)&0x8000000000000000;
于 2013-04-01T14:36:11.383 回答
0

使用 NaN 作为检查点:

#include <iostream>
#include <limits>
struct cll {
  double value;
  cll * next;
};
int main() {
  int N = 5;
  double input[] = {1,2,3,4,5};
  cll * first = new cll;
  first->value = std::numeric_limits<double>::quiet_NaN();
  cll * next = first;
  for (int i = 0; i < N; ++i) {
    cll * last = new cll;
    next->next = last;
    last->value = input[i];
    last->next = first;
    next = last;
  }
  next = next->next;
  next = next->next;
  while (next->value == next->value)  {
    next = next->next;
  }
  next = next->next;
  while (next->value == next->value) {
    std::cout << next->value << '\n';
    next = next->next;
  }
  return 0;
}
于 2013-04-01T14:49:05.433 回答