2013-04-01 73 views
0

我想创建一个循环链表,我需要找到最大值和最小值,所以我需要一些检查点停止,我想用-0在第一个元素中(它只是一个检查点而已)。 我不想使用任何其他的值,因为用户可以输入新的数据到列表中,如果用户输入-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; 
} 

感谢所有。

+3

难道很难检查自己? – 2013-04-01 14:26:18

+2

使用浮点值,有一个单独的-0和+0。然而,他们比较平等,所以他们之间的区分将是艰难的。 –

+1

我真的很难理解这个问题。看起来你有一个双打循环列表,并且你想用IEEE负零作为一个标记。正确?如果是这样,问题到底是什么? – NPE

回答

3

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

+1

那么,如果我们谈论符号量级或补码表示,你可以区分它们...... –

+0

@OliCharlesworth true,但那样就不会非常便携。 –

+0

在数学存在的概念左右界限http://www.millersville.edu/~bikenaga/calculus/limlr/limlr.html。所以它们之间有区别。不管我问的不是数学,而是C++。 – user1761284

1

这将需要您存储ints作为双打,介意。但你可以做这样的事情。

signbit可能会有诀窍。如果没有,尝试采取相互的。 1/+ 0.0 = + inf,1/-0.0 = -inf。作为最后的努力,做这样的事情:

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

'我使用整数值'问题的最后部分。 –

2

整数值在几乎普遍二进制补码系统不能是负零 - 有没有他们的代表。负零根本不存在。

对于IEEE浮点数可能会出现负零,但不会经常出现。将负数乘以0.0就可以做到。

我建议找到另一个定点值。

+1

负零并不罕见,结果的“标准化”通常不会将负零转换为正零。 IEEE-754浮点标准是关于何时操作返回-0以及何时操作返回+0的具体规定。 –

+0

@EricPostpischil,如果你愿意,似乎很容易生成“-0.0”,根据[Wikipedia](http://en.wikipedia.org/wiki/Signed_zero),“-1.0 * 0.0”可以生成。所以也许他们并不像我想象的那么难得。我几乎从未在野外遇到过。 –

+0

@MarkRansom - 大部分时间,程序员都不在乎差异。我现在可以想到的唯一结果是1.0/-0.0变为-infinity,1.0/0/0变为无穷大,并且'signbit'可以告诉它们的区别(就像@KitsuneYMG指出的那样)。无论如何,这样做的代码有问题。 –

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; 
} 
相关问题