[英]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)
就會起作用。 如果您希望行為明確定義,則必須遍歷char
和char*
數組。
在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.