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