为什么0.1f的最后一个二进制位舍入为1?

时间:2011-09-15 18:01:01

标签: floating-point binary ieee-754

我正在大学学习操作系统课程,最近我们学会了如何在内存中表示浮点数。

我们的作业是将浮动数字(float s)手动转换为二进制表示。

e.g。在漫长的转化过程之后,200,0234375会给01000011010010000000011000000000

其中一个问题是如何在内存中表示0.1f。所以我做了整个转换过程,最后得到了这个:

  

00111101110011001100110011001100

根据我们到目前为止所学到的,这是问题的正确答案(我问老师)。

但是,在下一个问题上,我们被要求用程序验证答案,以查看0.1f的实际二进制表示。真正的代表是:

  

00111101110011001100110011001101

(注意最后一位)

然后我们被要求尝试猜测为什么会发生这种情况。

我在转换数字时注意到了定期0011,并且由于最终0之后的下一位将是1,我会假设计算机会绕过最终0 1 1}}  到{{1}},这可以解释差异。

所以,我想知道的是,我是否正确? 当使用尾数的23位时,计算机是否根据下一位的位置舍入最后一位?

这是一个家庭作业,所以如果我错了,我可以简单地指导我找到答案,我会很感激。

此外,我无法通过Google搜索我能想到的关键字找到我的问题的答案。请原谅我这是否重复。

4 个答案:

答案 0 :(得分:3)

  

当使用尾数的23位时,计算机是否根据下一位的位置舍入最后一位?

是的,当然。默认情况下,编译器和浮点算术系统会尝试为您提供正确的舍入结果。

作为类比,如果我要求你写2/3到三位小数,你会回答0.666或0.667吗?它应该是0.667,因为它更接近真正的答案。

答案 1 :(得分:1)

我不太确定如何在不给出答案的情况下为您提供指导,但是,是的,您已经接受了。 IEEE标准包括对这种舍入的具体规定。查找 guard round sticky bits

答案 2 :(得分:1)

这取决于您的平台,特定浮点硬件以及该硬件上的特定设置。

特别是,在x86平台上,特定行为将取决于FPU或SSE控制字寄存器的内容。

答案 3 :(得分:1)

有几种舍入模式。

您可以在 wikipedia 中阅读相关内容。

这只是一个实施问题。 C ++没有标准。