2012-03-20 75 views
1

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

回答

1

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

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

+0

Duh ..明显的总是让我......对于读这个并且到达这里的任何人来到维基百科并且搜索“第n个根算法”,并且这个等式的后半部分在那里解释得非常好。这也可以用来删除任何不必要的sqrt()调用。这消除了很多不必要的代码,但我不知道完成后会有多少。我不会去编写这个了几天。 – user1054210 2012-03-21 14:59:51

0

你可能逃脱使用float代替doublepowf()更少的代码:

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

当然,其结果将是不太准确。

1

由于 的指数是固定的,因此您的问题比编写广义pow()函数稍微简单一些。您也可以从全功能的pow()中稍微放宽精度要求 。

选项1:为f(x)= x^1.4实施Taylor Series展开式。你会 需要选择一些x的值来扩大泰勒级数,并且当x离这个值越远,你将会失去精度。选项2:通过在某些 点数处列出x^1.4的值构造插值表,然后使用线性(或更高阶多项式)插值计算中间点处的值。