在c ++中 浮点数x = 131071.333
32位的位模式应为
0 10001111 11111111111111111010101
哪个可以读为十进制 131071.328125 但是输出来了 131071.335938 哪一个 0 10001111 111111111111111110101011
基本上哪个是33位错误?
答案 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足够接近原始版本。