簡體   English   中英

使用std :: bitset進行雙重表示

[英]Using std::bitset for double representation

在我的應用程序中,我試圖顯示雙精度變量的位表示。 它適用於較小的雙變量。 不適用於10 ^ 30級別。

碼:

#include <iostream>
#include <bitset>
#include <limits>
#include <string.h>

using namespace std;

void Display(double doubleValue)
{
    bitset<sizeof(double) * 8> b(doubleValue);
    cout << "Value  : " << doubleValue << endl;
    cout << "BitSet : " << b.to_string() << endl;
}

int main()
{
    Display(1000000000.0);
    Display(2000000000.0);
    Display(3000000000.0);

    Display(1000000000000000000000000000000.0);
    Display(2000000000000000000000000000000.0);
    Display(3000000000000000000000000000000.0);

    return 0;   
}

輸出:

/home/sujith% ./a.out
Value  : 1e+09
BitSet : 0000000000000000000000000000000000111011100110101100101000000000
Value  : 2e+09
BitSet : 0000000000000000000000000000000001110111001101011001010000000000
Value  : 3e+09
BitSet : 0000000000000000000000000000000010110010110100000101111000000000
Value  : 1e+30
BitSet : 0000000000000000000000000000000000000000000000000000000000000000
Value  : 2e+30
BitSet : 0000000000000000000000000000000000000000000000000000000000000000
Value  : 3e+30
BitSet : 0000000000000000000000000000000000000000000000000000000000000000

我擔心的是,為什么bitset總是給出64,后面的3總是為零。有趣的是,實際值的“ cout”按預期工作。

如果看一下std::bitset構造函數,您會發現它要么使用字符串作為參數,要么使用整數

這意味着您的double值將轉換為整數,並且沒有標准的整數類型可以容納這么大的值,從而導致未定義的行為

如果要獲取double的實際位數,則需要執行一些強制轉換技巧以使其起作用:

unsigned long long bits = *reinterpret_cast<unsigned long long*>(&doubleValue);

請注意,在C ++規范中未定義類似這種類型的類型轉換 ,但是只要sizeof(double) == sizeof(unsigned long long)就會起作用。 如果您希望行為明確定義,則必須遍歷charchar*數組。

在C ++ 14中, std::bitset現在需要一個unsigned long long構造函數,因此這可能起作用:

union udouble {
  double d;
  unsigned long long u;
};

void Display(double doubleValue)
{
    udouble ud;
    ud.d = doubleValue;
    bitset<sizeof(double) * 8> b(ud.u);
    cout << "Value  : " << doubleValue << endl;
    cout << "BitSet : " << b.to_string() << endl;
}

這應該為您提供雙精度的內部表示。 請參閱IdeOne上的工作示例代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM