Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中,0和-0之间有区别吗+;_C++_Algorithm - Fatal编程技术网

C++ 在c+中,0和-0之间有区别吗+;

C++ 在c+中,0和-0之间有区别吗+;,c++,algorithm,C++,Algorithm,我想创建一个循环链表,我需要在其中找到最大值和最小值,所以我需要一些检查点来停止,我想在第一个元素中使用-0(它将只是一个检查点,而不是其他任何东西)。 我不想使用任何其他值,因为用户可以在列表中输入新数据,如果用户输入-0,我将简单地在0上替换它,因为从数学角度看,它们之间没有区别(我不使用永远的小数字:)。 我使用整数值 这个问题现在不赚钱。 我尝试了一下,结果都是一样的: #include <iostream> using namespace std; int main()

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

这个问题现在不赚钱。 我尝试了一下,结果都是一样的:

#include <iostream>

using namespace std;

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

    return 0;
}
#包括
使用名称空间std;
int main(){
如果(0!=-0){

数学中的cout与数学中的
0
-0
是相同的值。你不能以任何方式区分它们,因此你可以使用你描述的这个条件。

与数学中的
0
-0
是相同的值。你不能以任何方式区分它们,因此你可以使用你描述的这个条件。

记住,s需要将整数存储为双精度整数,但你可以这样做

可能是这样。如果不是,请尝试使用倒数.1/+0.0=+inf,1/-0.0=-inf。作为最后的努力,请执行以下操作:

double d=-0.0;
bool is_neg = (*(uint64_t*)&d)&0x8000000000000000;

记住,这需要你将整数存储为双倍数,但你可以这样做

可能是这样。如果不是,请尝试使用倒数.1/+0.0=+inf,1/-0.0=-inf。作为最后的努力,请执行以下操作:

double d=-0.0;
bool is_neg = (*(uint64_t*)&d)&0x8000000000000000;

几乎通用的二补系统中的整数值不能为负零——它们没有表示法。负零根本不存在

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


我建议再找一个前哨值。

几乎通用的二补系统中的整数值不能是负零-它们没有表示法。负零根本不存在

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


我建议找到另一个sentinel值。

使用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;
}
#包括
#包括
结构cll{
双重价值;
cll*下一步;
};
int main(){
int N=5;
双输入[]={1,2,3,4,5};
cll*first=新的cll;
第一->值=标准::数值限制::安静(N);
cll*下一个=第一个;
对于(int i=0;i下一步=最后一步;
最后->值=输入[i];
最后->下一步=第一步;
下一个=最后一个;
}
下一步=下一步->下一步;
下一步=下一步->下一步;
而(下一个->值==下一个->值){
下一步=下一步->下一步;
}
下一步=下一步->下一步;
而(下一个->值==下一个->值){
std::下一个cout值;
}
返回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;
}
#包括
#包括
结构cll{
双重价值;
cll*下一步;
};
int main(){
int N=5;
双输入[]={1,2,3,4,5};
cll*first=新的cll;
第一->值=标准::数值限制::安静(N);
cll*下一个=第一个;
对于(int i=0;i下一步=最后一步;
最后->值=输入[i];
最后->下一步=第一步;
下一个=最后一个;
}
下一步=下一步->下一步;
下一步=下一步->下一步;
而(下一个->值==下一个->值){
下一步=下一步->下一步;
}
下一步=下一步->下一步;
而(下一个->值==下一个->值){
std::下一个cout值;
}
返回0;
}


检查自己有那么难吗?对于浮点值,有一个单独的-0和+0。但是,它们比较相等,所以很难区分它们。我真的很难理解这个问题。似乎你有一个循环的双精度列表,你想使用IEEE负零作为哨兵。对吗?如果是这样,问题到底是什么?@sftrabbit区分它们并不难,
1.0/0.0>1.0/-0.0
。这是一个关于整数或浮点数的问题吗?检查自己有那么难吗?对于浮点数,有一个单独的-0和+0。但是,它们比较相等,所以区分它们会很难。我真的很难很难理解这个问题。似乎你有一个循环的双精度列表,你想用IEEE负零作为哨兵。对吗?如果是,问题到底是什么?@sftrabbit区分它们并不难,
1.0/0.0>1.0/-0.0
。这是一个关于整数或浮点数的问题吗?嗯,你可以如果我们讨论符号大小或一个补码表示,请区分它们……OLICHARLISVEST是真的,但那不是很容易实现。数学中存在着左右限的概念。所以它们之间有区别。不管我问的不是数学,而是C++。它取决于数据类型。y、 如果我们谈论浮点数,有两种0的表示形式,一种是正的,一种是负的,它们没有相同的整数表示形式…@JBL明确指出OP使用整数。如果我们谈论的是符号大小或一个补码表示形式,你可以区分它们…@OliCharlesworth true,但是在数学中,存在着左右的界限,所以它们之间有区别。不管我问的不是数学,而是C++。它实际上取决于数据类型。如果我们讨论一个浮点,则有两个表示0,一个正和一个负,它们没有相同的整数表示。tations…@JBL明确指出OP使用整数。
我使用整数值
问题的最后一部分。
我使用整数值
问题的最后一部分。负零并不少见,而且“标准化”结果的类型通常不会将负零转换为正零。IEEE-754浮点标准规定了操作何时返回-0和操作何时返回