gpt4 book ai didi

logarithm - 使用 sqrt() 查找 log2()

转载 作者:行者123 更新时间:2023-12-03 06:46:35 25 4
gpt4 key购买 nike

这是我在某个网站上看到的面试问题。

有人提到,答案涉及形成 log2() 的递归,如下所示:

double log2(double x )
{
if ( x<=2 ) return 1;
if ( IsSqureNum(x) )
return log2(sqrt(x) ) * 2;
return log2( sqrt(x) ) * 2 + 1; // Why the plus one here.
}

至于重复,显然+1是错误的。此外,基本情况也是错误的。有谁知道更好的答案吗?log() 和 log10() 在 C 中实际是如何实现的。

最佳答案

也许我已经找到了面试官正在寻找的确切答案。就我而言,我想说在面试压力下得出这一点有点困难。这个想法是,假设你想找到 log2(13) ,你可以知道它在3到4之间。另外3 = log2(8) and 4 = log2(16) ,

根据对数的性质,我们知道log( sqrt( (8*16) ) = (log(8) + log(16))/2 = (3+4)/2 = 3.5

现在,sqrt(8*16) = 11.3137log2(11.3137) = 3.5 。自 11.3137<13 ,我们知道我们想要的 log2(13) 将位于 3.5 和 4 之间,我们继续找到它。很容易注意到,这有一个二分搜索解决方案,当我们的值收敛到 log2() 的值时,我们迭代到一个点。我们希望找到。代码如下:

double Log2(double val)
{
int lox,hix;
double rval, lval;
hix = 0;
while((1<<hix)<val)
hix++;
lox =hix-1;
lval = (1<<lox) ;
rval = (1<<hix);
double lo=lox,hi=hix;
// cout<<lox<<" "<<hix<<endl;
//cout<<lval<<" "<<rval;
while( fabs(lval-val)>1e-7)
{
double mid = (lo+hi)/2;
double midValue = sqrt(lval*rval);

if ( midValue > val)
{
hi = mid;
rval = midValue;
}
else{
lo=mid;
lval = midValue;
}
}
return lo;

}

关于logarithm - 使用 sqrt() 查找 log2(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5701023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com