在C++中将双精度类型转换为二进制

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

我有一个任务是使用 NIST-800-22 在 C++ 中测试各种伪随机数生成器。 NIST 测试套件要求我转换生成的数字并以二进制格式存储它们,对于整数来说这并不难。生成器仅生成双精度类型数字会出现问题。

我知道 double 类型按照 IEEE 754 标准存储为浮点数,但我真的不知道如何将其转换为二进制。 ChatGPT向我建议了一些解决方案,但是转换后的数字看起来像这样 0011111111100100001010110110010110100000000000000000000000000000,它看起来不是随机的,我认为它对存储的数据干扰太多。

我的问题是,有没有办法读取原始生成的二进制数据,或者如何获取它?

Code Chat 建议我使用:

std::string doubleToBinary(double num) {
    uint64_t rawBits;
    std::memcpy(&rawBits, &num, sizeof(double));
    std::bitset<64> binary(rawBits);
    return binary.to_string();
}
c++ cryptography binary
1个回答
0
投票

仅当

std::string doubleToBinary(double num)
完全等于
sizeof(uint64_t)
时,
sizeof(double)
函数才会起作用。 对于大多数系统来说都是如此,但对于任何系统来说不一定如此。要检查给定系统是否确实如此,请参阅Stack Overflow:确保 C++ 双精度数为 64 位

  • 如果

    sizeof(uint64_t) is < 
    sizeof(double)
    , then 
    memcpy()
    will copy more bytes than
    rawBits` 可以容纳,从而损坏你的堆栈。

  • 如果

    sizeof(uint64_t) is > 
    sizeof(double)
    , then 
    memcpy()
    will only fill part of
    rawBits
    , and the remaining part will be garbage, which means that anything you do with 
    rawBits`之后将是错误的。

我要做的是声明一个

byte[sizeof(double)]
数组(其中
byte
也称为
uint8_t
),并且我会将
memcpy()
double
的地址放入数组中
byte
。据我所知,这是“以二进制格式存储的数字”。

我最终会将

byte
的数组转换为
std::string
,如果NIST需要这样的转换,但我不知道它是否是这样,即使是这样,我也不知道这个字符串应该是什么格式拥有。

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