我试图了解如何使用 IEEE754 标准将浮点数(例如 5.1 )转换为 C++ 中的二进制形式。
根据我的理解,
5.1
中的IEEE754
应该使用0 10000000001 0100011001100110011001100110011001100110011001100110
来表示。
我尝试使用以下函数获取该格式
std::string hexToBinaryIEEE754(const std::string& hexStr) {
// Convert hex string to unsigned long long
unsigned long long hexValue = std::stoull(hexStr, nullptr, 16);
// Convert hex value to IEEE 754 binary representation
std::bitset<64> bits(hexValue);
return bits.to_string();
}
不幸的是返回的值是
0100000000010100011001100110011001100000000000000000000000000000
关于如何以二进制格式返回的任何想法都可以在
CVC5
等函数中使用:
Term v = slv->mkBitVector(32, <value>);
谢谢
假设机器的常见架构是二进制补码、大端或小端、以及 8 位到一个字节。如果您可以相信机器的浮点型和双精度型内部存储确实是 IEEE754,那么您可能只需枚举值地址处的位即可。
类似这样的事情。
bool isBigEndian() {
return htons(1234) == 1234; // include <winsock2.h> or <arpa/inet.h>
}
template<typename T>
std::string numberToBitString(T value) {
std::string s;
const uint8_t len = sizeof(value);
uint8_t tmp[len];
uint8_t* ptr = (uint8_t*)&value;
// fixup for little endian machines (Intel, Mac Native Silicon, etc...)
if (!isBigEndian()) {
for (size_t i = 0; i < len; i++) {
tmp[sizeof(value) - 1 - i] = ptr[i];
}
ptr = tmp;
}
// enumerate the bits from MSB to LSB on each byte
for (size_t i = 0; i < len; i++) {
for (size_t j = 0; j < 8; j++) { // 8 bits in a byte
unsigned int mask = 0x80 >> j;
s += (ptr[i] & mask) ? "1" : "0";
}
}
return s;
}
int main() {
const double value = 5.1;
std::string s = numberToBitString(value);
std::cout << value << " = " << s << "\n";
return 0;
}
上面将打印出:
5.1 = 0100000000010100011001100110011001100110011001100110011001100110