为啥 frexp/ldexp 有效数的范围是 [0.5, 1.0)? [复制]
Posted
技术标签:
【中文标题】为啥 frexp/ldexp 有效数的范围是 [0.5, 1.0)? [复制]【英文标题】:Why does frexp/ldexp significand range from [0.5, 1.0)? [duplicate]为什么 frexp/ldexp 有效数的范围是 [0.5, 1.0)? [复制] 【发布时间】:2015-08-29 06:08:14 【问题描述】:当 IEEE 745 浮点值实际上具有范围为 [1.0, 2) 的有效数字时,为什么 frexp/ldexp 函数的有效数字范围为 [0.5, 1.0)?
【问题讨论】:
C89 和 C99 标准随附的基本原理文档未提及此问题。一个合理的猜测是选择这种归一化是因为创建 C 的人很熟悉它,因为 DEC 架构上的浮点格式使用归一化为 [0.5,1) 的尾数,而不是为IEEE 格式稍后介绍。 "那么为什么 frexp() 将小数点放在隐式位的左侧,并返回 [0.5, 1) 中的数字,而不是类似科学记数法的 [1, 2)" - “也许 frexp 返回的格式对 PDP-11 的浮点格式有意义” 【参考方案1】:对于任何非 0 或非正规的有效浮点值,尾数的高位始终为 1。IEEE-754 通过不将其编码为二进制值来利用这一点,从而挤出一位额外的精度.像 double 有 53 位精度但只编码 52。所以 encoded 值永远不会小于 1,范围是 [1.0 .. 2)
但是一旦需要实际值,例如当您 printf() 或需要进行计算时,则需要从编码值中恢复该位。通常在处理器的浮点执行单元内部完成。否则就是臭名昭著的英特尔 x87 FPU 设计的 80 位内部格式背后的灵感。所以 实际 范围是 [0.5 .. 1)。 frexp 函数适用于实际值。
【讨论】:
我不关注。什么正在恢复,“实际值”是什么意思? Hmya,您必须更多地了解浮点值的编码方式才能理解它。这不是很直观。关键是您可以从 52 个存储位中获得 53 位精度。***有很多关于它的资料,例如查看“双精度”文章。 我非常清楚 IEEE 745 浮点值是如何工作的。我仍然看不出尾数的隐含位与范围 [0.5, 1.0) 有什么关系。这就是你需要解释的。 我不同意你的断言,即非编码位以某种方式暗示了 [0.5, 1.0) 的正常范围。如果浮点数为 33 位且尾数为 24 位,则不会有任何改变。在我看来,这是一个武断的选择,而且不太合乎逻辑。 对于归一化浮点数,尾数的范围为 [1.0, 2.0),对于非正规数,尾数的范围为 [0.0, 1.0),两者都不是 [0.5, 1.0)。以上是关于为啥 frexp/ldexp 有效数的范围是 [0.5, 1.0)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥即使我使用 sparse_categorical_crossentrpy,我也会收到“收到超出 [0, 1) 有效范围的标签值 6”?