【问题标题】:Understanding the binary representation of a float了解浮点数的二进制表示
【发布时间】:2019-06-06 15:33:22
【问题描述】:

我正在使用以下代码打印出浮点数的“二进制表示”:

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...。第二个是有道理的。我对之后的每一个输出都感到困惑,尤其是最后一个。

提前致谢。

【问题讨论】:

  • 标准中没有规定,但所有主要编译器都使用IEEE-754作为浮点表示。
  • "我希望第一个只是10000..." 为什么?这不是负数..
  • 因为如果 2 由 01 表示,那么对于 1,您会将 1 滑过使其成为 10
  • @zoecarver 第一位通常(即使在整数实现中)保留用于区分符号。 0 = 正; 1 = 否定。
  • 现在说得通了。 @AlgirdasPreidžius 感谢您的解释。

标签: c++ floating-point binary


【解决方案1】:

假设您指的是 IEEE754 二进制浮点格式,则 32 位浮点数由 1 个符号位、8 个指数位和 23 个有效位(也称为小数)位组成。以下是您的一个示例 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

【讨论】:

猜你喜欢
  • 2017-06-16
  • 2016-05-01
  • 2016-01-01
  • 2015-12-02
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多