使用 std::bitset 进行双重表示

问题描述 投票:0回答:2

在我的应用程序中,我试图显示双变量的位表示。 它适用于较小的双变量。不适用于 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”按预期工作。

c++ double bitset
2个回答
5
投票

如果您查看 std::bitset

 构造函数
,您会发现它要么采用字符串作为参数,要么采用 整数

这意味着您的

double

值将转换为整数,并且没有标准整数类型可以容纳如此大的值,这会导致
未定义的行为

如果您想获得

double

 的实际部分,您需要执行一些转换技巧才能使其发挥作用:

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

注意,像这样的

type-punning在C++规范中没有定义,但是只要sizeof(double) == sizeof(unsigned long long)

就可以了。如果您希望行为得到明确定义,您必须遍历 
char
char*
 数组。


2
投票
在 C++14 中,

std::bitset

(在标头 
<bitset>
 中定义)现在采用 
unsigned long long
 构造函数,因此这可能有效:

union udouble { double d; unsigned long long u; }; void Display(double doubleValue) { udouble ud; ud.d = doubleValue; std::bitset<sizeof(double) * 8> b(ud.u); std::cout << "Value : " << doubleValue << std::endl; std::cout << "BitSet : " << b.to_string() << std::endl; }
这应该给你一个双精度的内部表示。请参阅 

IdeOne 上的工作示例代码。

© www.soinside.com 2019 - 2024. All rights reserved.