【发布时间】:2015-11-16 12:27:18
【问题描述】:
我需要在 没有浮点运算且没有 @987654324 的嵌入式处理器上计算 C 中 0 < u < 1 和 0 < p < 1 的数学表达式 floor(ln(u)/ln(1-p)) @ 功能。结果是一个正整数。我知道极限情况(p=0),稍后我会处理它们......
我想该解决方案涉及使u 和p 的范围超过0..UINT16_MAX,并使用查找表来查找对数,但我无法弄清楚究竟如何:查找表映射到什么?
结果不必是 100% 准确的,近似值即可。
谢谢!
【问题讨论】:
-
你如何代表
u和p? -
这个问题有点宽泛,那么(尤其是“不是 100% 准确”可能意味着任何事情......)。您可以使用
uint16_t来表示(例如)u * 65536。然后,您可以(理论上)使用返回ln(u)的查找表。然后你可以实现一个整数除法。 -
当然。您需要权衡取舍(主要是在动态范围和分辨率之间)。您还可以将查找表的输出表示为缩放值。
-
可能你的处理器有一个快速的
count leading zeros指令,可以用来逼近log base2。 -
除了使用查找表之外,也许您可以使用系列
ln(1+x) = x - x^2/2 + x^3/3 - x^4/4 ...where-1 < x <= 1实现定点运算
标签: c math embedded logarithm lookup-tables