【问题标题】:Why does frexp() not yield scientific notation?为什么 frexp() 不产生科学计数法?
【发布时间】:2014-07-24 08:34:33
【问题描述】:

科学记数法是用明确的数量级表示数字的常用方法。首先是一个非零数字,然后是小数点,然后是小数部分和指数。在二进制中,只有一个可能的非零数字。

浮点数学涉及隐含的第一个数字等于 1,然后尾数位“跟随小数点”。

那么为什么frexp() 将小数点放在隐式位的左侧,并在 [0.5, 1) 中返回一个数字,而不是类似于科学记数法的 [1, 2)?是否有一些溢出需要注意?

实际上,它比 IEEE 754/ISO 60559 指定的偏差值多减一。在硬件中,这可能会用加法换取 XOR。单独来看,这似乎是一个非常薄弱的​​论点,考虑到在许多情况下恢复正常需要另一个浮点运算。

【问题讨论】:

  • 我认为这个问题可以简化:在传统的教科书科学记数法中,以 b 为基数的数字,其显着性选择在 [1, b)。但是frexp 使用约定将有效数字放在范围 [1 / b, 1) 中。哪一个是对的?哪一个更好?我认为这有点像询问范围索引应该从零开始还是从一开始。
  • @KerrekSB 实际上,我现在只是在实现一个对数库,frexp 适合。对数的组成部分是 [1, 2) 约定的返回值。我想我的问题可以通过 [1/b, 1) 的适用性示例来回答,但我真的想知道为什么 frexp 是由最初设计它的人设计的。
  • 你是对的 - 事实上,[1, b) 只是范围 [0, 1) 的指数,我们已经同意是 the right way to denote ranges
  • frexp() 确实产生“科学记数法”。 “科学记数法”是apower(base, exponent) Refa 没有义务狭窄的范围。 “标准化科学记数法”对a 有一个限制范围。首先是一个非零数字,然后是小数点,然后是小数部分和指数。”是“科学记数法”的过于狭隘的定义。关于为什么 @987654334 的帖子仍然是一个的问题@ 会返回 significandexponent,因为它的标题可以更直接、更公正地说明问题。

标签: c floating-point posix ieee-754


【解决方案1】:

rationale 说:

4.5.4.2 frexp 函数

函数 frexp、ldexp 和 modf 是由 图书馆的其余部分。有一些放弃它们的情绪 出于同样的原因,ecvt、fcvt 和 gcvt 被删除了,但是它们的 追随者将它们救出以供一般使用。它们的使用是有问题的:在 非二进制架构 ldexp 可能会丢失精度,而 frexp 可能会丢失 效率低下。

可以推测,“库的其余部分”使用frexp 的约定更方便编写,或者传统上已经针对此接口编写,尽管它没有提供任何好处。

我知道这并不能完全回答问题,但它不太适合评论。

我还应该指出,在 C 语言设计中所做的一些选择早于 IEEE 754。frexp 返回的格式可能与 PDP-11 的浮点格式有关,或任何其他首次引入函数frexp 的架构。编辑:另请参阅manual 的第 155 页,了解一种 PDP-11 型号。

【讨论】:

  • 谢谢,这当然不仅仅是评论!它的起源是 UNIX 并不奇怪,但有趣的是有人曾经试图杀死它。
  • 是的,PDP-11 浮点被记录为在“隐藏”位的左侧具有二进制点......所以对于指数 == 0,数字是,根据 frexp( ), 0.5..0.99999... 有趣的是,PDP-11 和 IEEE 格式之间几乎没有区别——实际上区别在于应用于指数的偏差,对于 IEEE,偏差是 127(对于单个长度),其中PDP-11 相同的位模式(模字节排序)(有效)具有 129 的偏差。
  • @gmch 这将是一个很好的答案。即使我们不能确定没有其他原因,它也闻起来像确凿的证据。
  • 其实我就接受了。请参阅this manual 的第 155 页。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 2017-10-16
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多