我在一本书上看到了用单片机提取root的方法。我无法理解这个过程。为什么下面的代码中p=0x80?在这种情况下,如果我们的数量很小,它会做很多无用的循环,不是吗?
unsigned int math_sqrt(unsigned int x)
{
unsigned char ans = 0,p = 0x80;
while(p!=0){
ans+=p;
if(ans*ans>x)
ans-=p;
p = (unsigned char)(p/2);
}
return ans;
}
我是微 Controller 和C语言的新手,很抱歉我的英语表达可能有些问题。顺便问一下,我可以在 stm32 或 K60 等微 Controller 中使用 math.h
吗?谢谢。
最佳答案
只是对乔纳森的好答案的数学补充。
算法之外的基本原理是,uint16_t
的平方根是 uint8_t
,这意味着 0 到 255 之间的数字。正如函数 square 和 square根都是单调的,可以使用二分法来找到最接近的解决方案。您只需从可能的间隔中间开始,即 128 或 0x80。然后,每次以一半大小的间隔进行迭代,这样很快(最多 8 个阶段)就可以达到大小为 1 的间隔:解决方案。
关于c - 使用微 Controller 提取根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47614390/