浮点数据类型误解

时间:2019-04-21 06:14:20

标签: c++

在c ++中 浮点数x = 131071.333

32位的位模式应为

0 10001111 11111111111111111010101

哪个可以读为十进制 131071.328125 但是输出来了 131071.335938 哪一个 0 10001111 111111111111111110101011

基本上哪个是33位错误?

3 个答案:

答案 0 :(得分:4)

最接近131071.333的浮点数是 131071.3359375(0.003的错误)为01000111111111111111111110101011,这比您的值下方的浮点数131071.328125(0.005的错误)更准确。

这是一个方便的工具,可用来玩浮动https://www.h-schmidt.net/FloatConverter/IEEE754.html

答案 1 :(得分:1)

注意:此答案假定您对IEEE 754流行的float实现进行操作。 C ++不需要这样实现float,但它是PC和服务器的事实上的标准。

通过观察33位,您非常有float32位格式中有隐含的位,其中尾数的隐式前导位始终为1。此隐式前导1位从不存储在内存毕竟总是1(我忽略了这个答案中的次标准值)。由于未存储隐式位,因此将33位(1个符号,8个指数,24个significand with implicit bit)存储在32位存储器中。

所以你写的是

0 10001111 111111111111111110101011 (33 bits)
           ^ 
        implicit 1 bit (also known as hidden bit)

这被评估为2 0b10001111-127 * 0b1.11111111111111111110101011 = 2 16 * 1.99998986721038818359375 = 131071.33593750

很容易看出,所有33位都必须代表该值。幸运的是,上面的内容实际上没有尾数的前1位进行存储,因此可以将其存储为32位。如果您检查float的存储空间,则只会看到32位(没有隐藏位):

0 10001111 11111111111111110101011 (32 bits)
          ^ As if the hidden bit is inserted here.

这样,还有另一种精度可以使131071.335938表示得比131071.333更接近131071.328125,而没有隐含前导位的32位精度(原为{ {1}}。

Alan Birtles的answer引用了a conversion tool,可让您使用浮点格式。

答案 2 :(得分:-3)

很遗憾,我们的计算机质量不好,无法处理浮点数。因此131071.335938足够接近原始版本。