【发布时间】: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()确实产生“科学记数法”。 “科学记数法”是a次power(base, exponent)Ref。a没有义务狭窄的范围。 “标准化科学记数法”对a有一个限制范围。首先是一个非零数字,然后是小数点,然后是小数部分和指数。”是“科学记数法”的过于狭隘的定义。关于为什么 @987654334 的帖子仍然是一个好的问题@ 会返回significand和exponent,因为它的标题可以更直接、更公正地说明问题。
标签: c floating-point posix ieee-754