2013-04-01 101 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; 
} 
相關問題