制作自己的战俘()

时间:2012-03-20 23:49:06

标签: math.h

我有一个项目,我们试图让代码空间缩小。我们在一个文件中有一个位置,它从数学库中调用pow()函数,为这一行代码添加额外的+ 12k代码到最终的十六进制。我已经做了一些搜索,我似乎无法找到在数学库之外执行pow函数的好方法。我发现的每个例子都是使用数学库。最糟糕的是我需要浮点数,因为我需要提高一些不断变化到1.4的幂的未知变量,而我告诉的控制器实际上并没有浮点数。我被告知一些没有浮点的72Mhz 32位ARM设备,因此一个库函数的空间很大。有没有其他人试图这样做并赢得了这场战斗?

3 个答案:

答案 0 :(得分:1)

你的问题比写一个通用的pow()函数要简单一些,因为 指数是固定的。您也可以放宽精度要求 有点来自全功能的pow()。

选项1:为f(x)= x ^ 1.4实施Taylor Series扩展。你会 需要选择一些关于扩展泰勒系列的x值,你就可以了 x越远离此值,精度就越低。

选项2:通过在某些位置列出x ^ 1.4的值来构造插值表 点数,然后使用线性(或更高阶多项式)插值 计算中间点的值。

答案 1 :(得分:1)

您可以使用this rule on fractional exponents将其分解为整数根和整数幂函数一个接一个地应用。

由于指数是固定的,这可以使您的代码更简单,因为1.4 = 7/5。现在,您只需要编写一个函数,在整数输入上一次执行这两个步骤,就可以避免浮点计算的丢失。

答案 2 :(得分:0)

您可以使用float而不是doublepowf()来减少代码:

float var=0.12345f;
var=powf(var,1.4f);

当然,结果会不太准确。