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