我正在使用以下代码来打印浮点数的“二进制表示形式”:
template<class F>
void printBinary(F value)
{
std::cout <<
std::bitset<sizeof(F) * 8>(*reinterpret_cast<unsigned long*>(&value)).to_string()
<< std::endl;
}
int main()
{
float f = 1;
printBinary(f);
f = 2;
printBinary(f);
f = 3;
printBinary(f);
f = 4;
printBinary(f);
f = 16;
printBinary(f);
f = 0.2;
printBinary(f);
}
它输出:
00111111100000000000000000000000
01000000000000000000000000000000
01000000010000000000000000000000
01000000100000000000000000000000
01000001100000000000000000000000
00111110010011001100110011001101
有人可以解释输出二进制数的哪些部分对应于浮点数的哪些部分?我希望第一个只是
10000...
。第二点很有意义。我对之后的每个输出都感到困惑,尤其是最后一个输出。提前致谢。
最佳答案
假设您使用的是IEEE754二进制浮点格式,则32位浮点数由1个符号位,8个指数位和23个有效(aka分数)位组成。作为示例,这是您的示例0.2
的表示方式:
3 2 1 0
1 09876543 21098765432109876543210
S ---E8--- ----------F23----------
Binary: 0 01111100 10011001100110011001101
Hex: 3E4C CCCD
Precision: SP
Sign: Positive
Exponent: -3 (Stored: 124, Bias: 127)
Hex-float: +0x1.99999ap-3
Value: +0.2 (NORMAL)
您可以在Wikipedia页面上了解更多有关格式本身的信息:https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats,以及在https://en.wikipedia.org/wiki/Single-precision_floating-point_format中了解单精度格式的细节。
关于c++ - 了解浮点数的二进制表示形式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56480843/