我想知道如何在没有math.h的情况下使用双倍功能来创建一个函数
例如,如果我想要
4.3^2.5
答案 0 :(得分:1)
这是一个粗略的轮廓。
除了域和特殊情况的问题之外, pow(x, y)
在数学上等同于exp(log(x)*y)
。 log(x)
和exp(x)
可以用系列近似。
泰勒系列可以从头开始计算。高级实现使用预先针对特定情况设计的minimax多项式变体。
通常,在计算log
时,我们将参数的指数部分与小数部分分开,然后使用多项式来近似对数,然后为指数部分添加对数。
在计算exp
时,我们将整数和小数部分分开并乘以每个部分的exp
。
使用基数为2的浮点数,通常使用基数为2的对数和取幂。那么指数 e 的对数(代表2 e )只是 e 。
因为在执行此操作时,您希望操作浮点值的指数和有效位,您必须访问它们的编码。 math.h
为此提供了frexp
和ldexp
等惯例。要在没有math.h
的情况下执行此操作,您需要访问对象的字节,这是另一个Stack Overflow问题的主题。
创建大致正确的pow
版本并不难。计算误差并证明它们的界限需要花费大量的工作,并且通常难以设计多项式和其他计算来减少误差。