科学记数法是表达具有明确数量级的数字的常用方法。首先是非零数字,然后是小数点,然后是小数部分和指数。在二进制中,只有一个可能的非零数字。
浮点数学涉及隐含的第一个数字等于1,然后尾数位“跟随小数点。”
那么为什么frexp()
将小数点放在隐含位的左边,并返回[0.5,1]中的数字而不是像科学符号那样的[1,2]?是否有一些溢出要注意?
实际上它比IEEE 754 / ISO 60559规定的偏差值减去一个以上。在硬件中,这可能会增加XOR的附加值。考虑到在许多情况下恢复正常将需要另一个浮点运算,这似乎是一个相当弱的论点。
答案 0 :(得分:12)
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模型。