为什么frexp()不能产生科学记数法?

时间:2014-07-24 08:34:34

标签: c floating-point posix ieee-754

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

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

那么为什么frexp()将小数点放在隐含位的左边,并返回[0.5,1]中的数字而不是像科学符号那样的[1,2]?是否有一些溢出要注意?

实际上它比IEEE 754 / ISO 60559规定的偏差值减去一个以上。在硬件中,这可能会增加XOR的附加值。考虑到在许多情况下恢复正常将需要另一个浮点运算,这似乎是一个相当弱的论点。

1 个答案:

答案 0 :(得分:12)

rationale说:

  

4.5.4.2 frexp功能

     

函数frexp,ldexp和modf是原语使用的   图书馆的其余部分。放弃它们有一些情绪   出于同样的原因,ecvt,fcvt和gcvt被丢弃,但他们的   信徒们将他们救出以供一般使用。它们的使用存在问题:开启   非二进制体系结构ldexp可能会丢失精度,而frexp可能会丢失   低效的。

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

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

我还应该指出,在C语言设计中做出的一些选择早于IEEE 754. frexp返回的格式也许与PDP-11的浮点格式有关( s),或首次引入函数frexp的任何其他体系结构。编辑:另请参阅manual的第155页,了解一个PDP-11模型。