单个精度浮点数上的第 24 个分数位在哪里?IEEE 754
Where's the 24th fraction bit on a single precision float? IEEE 754
今天我发现自己在做一些位操作,我决定刷新一下我的浮点知识
事情进展得很好直到我看到这个:
有效位的23个小数位出现在存储器格式中,但总精度为24位
我读了一遍又一遍,但我仍然不知道第24位在哪里,我注意到了关于binary point
的一些东西,所以我假设它是mantissa
和exponent
之间的中间点。
我真的不确定,但我相信作者在谈论这一点:
Binary point?
|
s------e-----|-------------m----------
0 - 01111100 - 01000000000000000000000
^ this
由于标准化,第24位是隐式的。
有效位向左移动(每次位移动从指数中减去一),直到有效位的前导位为1。
然后,由于前导比特是1,因此实际上仅存储其他23个比特。
还有一个非正规数的可能性。指数存储为"偏置"格式的有符号数,这意味着它是一个无符号数,其中范围的中间定义为0
1。因此,对于8位,它被存储为0..255之间的数字,但0被解释为-128,128被解释为0,255被解释为127(我可能有一个fencepost错误,但你明白了)。
如果在归一化过程中,它被递减到0(意味着实际指数值为-128),则归一化停止,有效位按原样存储。在这种情况下,规范化后的隐式位取为0,而不是1。
大多数浮点硬件的设计基本上是假设数字将被归一化,所以他们假设隐式位是1。在计算过程中,他们检查非正规数的可能性,在这种情况下,他们所做的大致相当于抛出异常,并在考虑到这一点的情况下重新开始计算。这就是为什么使用非标准化的计算通常会比其他情况下慢得多。
- 如果你想知道它为什么使用这种奇怪的格式:IEEE浮点(和许多其他浮点一样)旨在确保,如果你将其比特模式视为相同大小的整数,你可以将它们作为有符号的2的补码整数进行比较,并且它们仍将作为浮点数字按正确的顺序排序。由于数字的符号在最高有效位(它是2的补码整数),因此被视为符号位。指数的位被存储为下一个最高有效位,但如果我们对它们使用2的补码,小于0的指数将设置该数字的第二高有效位,这将导致看起来像是一个整数的大数字。通过使用偏置格式,较小的指数保留该位,较大的指数设置该位,因此整数的顺序反映浮点的顺序
通常(请原谅双关语),浮点数的前导位总是1;因此,它不需要存储在任何地方。原因是,如果它不是1,那就意味着你选择了错误的指数来表示它;通过向左移动尾数位并使用较小的指数,可以获得更高的精度。
一个例外是非正规/亚正规数,它由指数字段中的所有零位(可能的最低指数)表示。在这种情况下,尾数中没有隐含的前导1,并且随着值接近零,精度会递减。
对于正常浮点数,存储在浮点变量中的数字是(忽略符号)1. mantissa * 2
exponent-offset
。前导1未存储在变量中。
- C++我需要了解在哪里使用指针和双指针
- 未定义的引用在哪里
- 谷歌测试中的期望值存储在哪里
- 尽管遵循了规则,内存泄漏在哪里
- 静态数据成员模板专用化的实例化点在哪里
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在哪里声明结构运算符重载
- C++ 中的自定义异常:在哪里定义它们?
- 常量参数存储在哪里 (C++)?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在哪里存储跨平台C++应用存储?
- C++泛型类错误,问题出在哪里?
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 将类作为主要参数的语法在哪里需要?
- 模板参数在 C++ 中存储在哪里?
- 我的重复检查代码中的错误究竟在哪里?
- 在哪里可以找到 std::bitset 的数据成员?
- 单个精度浮点数上的第 24 个分数位在哪里?IEEE 754