我正在大学学习操作系统课程,最近我们学会了如何在内存中表示浮点数。
我们的作业是将浮动数字(float
s)手动转换为二进制表示。
e.g。在漫长的转化过程之后,200,0234375
会给01000011010010000000011000000000
。
其中一个问题是如何在内存中表示0.1f。所以我做了整个转换过程,最后得到了这个:
00111101110011001100110011001100
根据我们到目前为止所学到的,这是问题的正确答案(我问老师)。
但是,在下一个问题上,我们被要求用程序验证答案,以查看0.1f的实际二进制表示。真正的代表是:
00111101110011001100110011001101
(注意最后一位)
然后我们被要求尝试猜测为什么会发生这种情况。
我在转换数字时注意到了定期0011
,并且由于最终0
之后的下一位将是1
,我会假设计算机会绕过最终0
1
1}}
到{{1}},这可以解释差异。
所以,我想知道的是,我是否正确? 当使用尾数的23位时,计算机是否根据下一位的位置舍入最后一位?
这是一个家庭作业,所以如果我错了,我可以简单地指导我找到答案,我会很感激。
此外,我无法通过Google搜索我能想到的关键字找到我的问题的答案。请原谅我这是否重复。
答案 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)