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

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

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

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

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

理由说:

4.5.4.2 frexp函数

函数frexp,ldexp和modf是库的其余部分使用的基元。 由于ecvt,fcvt和gcvt被丢弃的原因相同,有一些人放弃它们的情绪,但他们的追随者将它们救出来供一般使用。 它们的使用是有问题的:在非二进制体系结构上,ldexp可能会失去精度,而frexp可能效率低下。

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

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

我还应该指出,在C语言设计中做出的一些选择早于IEEE 754. 也许frexp返回的格式与PDP-11的浮点格式或任何其他架构有关。函数frexp是介绍的。 编辑:另请参阅手册的第155页,了解一个PDP-11型号。