C++程序计算给定值的以2为底的对数


在不同的应用程序中,计算以2为底的对数是必要的。有一些快捷方法可以记住一些对数值以备竞争性考试使用。在编程中,我们有很多选项可以使用库函数计算对数结果,也有一些技巧可以计算它们。在这篇文章中,我们将讨论一些在C++中计算给定数字以2为底的对数的技巧。

使用log2()函数

log2()是一个库函数,用于计算给定参数以2为底的对数。答案可能是整数或浮点数。使用这种方法非常简单,它需要cmath库来导入此函数,然后只需使用数值参数调用它,它将自动计算该数字以2为底的对数。让我们看看语法和相应的程序来了解其用法。

语法

#include < cmath >
Log2( <number> )

算法

  • 输入一个数字x。
  • 使用log2(x)计算x的以2为底的对数。
  • 返回结果。

示例

#include <iostream> #include <cmath> using namespace std; float solve( int x ) { float answer; answer = log2( x ); return answer; } int main() { cout << "Log base 2 for input x = 32 is: " << solve( 32 ) << endl; cout << "Log base 2 for input x = 1024 is: " << solve( 1024 ) << endl; cout << "Log base 2 for input x = 568 is: " << solve( 568 ) << endl; cout << "Log base 2 for input x = 1059 is: " << solve( 1059 ) << endl; }

输出

Log base 2 for input x = 32 is: 5
Log base 2 for input x = 1024 is: 10
Log base 2 for input x = 568 is: 9.14975
Log base 2 for input x = 1059 is: 10.0485

使用其他底数的对数函数

对数有一些有趣的性质。我们可以从任何底数计算另一个底数的对数结果。要使用任何对数底数k计算log2(x),可以使用以下公式:

$$\log_{2}({x})\:=\:\frac{\log_{k}{x}}{\log_{k}{2}}$$

算法

  • 输入一个数字x。
  • nume := log-base-k(x)。
  • deno := log-base-k(2)。
  • 返回(nume / deno)。

示例

#include <iostream> #include <cmath> using namespace std; float solve( int x ) { float nume, deno; nume = log( x ); deno = log( 2 ); return nume / deno; } int main() { cout << "Log base 2 for input x = 32 is: " << solve( 32 ) << endl; cout << "Log base 2 for input x = 1024 is: " << solve( 1024 ) << endl; cout << "Log base 2 for input x = 568 is: " << solve( 568 ) << endl; cout << "Log base 2 for input x = 1059 is: " << solve( 1059 ) << endl; }

输出

Log base 2 for input x = 32 is: 5
Log base 2 for input x = 1024 is: 10
Log base 2 for input x = 568 is: 9.14975
Log base 2 for input x = 1059 is: 10.0485

使用位运算符

也可以使用位移运算符计算以2为底的对数,但这只适用于整数,或者结果将是地板值。我们知道幂是将一个数字自身相乘多次。在这里我们做反向操作,将数字多次除以2,并计算我们可以除多少次,结果是1或更多。现在将数字除以2类似于向右移动1位,所以这可以使用位移运算符完成,这比移位更快。让我们看看算法以便更好地理解。

算法

  • 输入一个数字x。
  • count := -1。
  • 当x非零时,执行。
    • x := x向右移动1位后的结果。
    • count := count + 1。
  • 返回count。

示例

#include <iostream> #include <cmath> using namespace std; float solve( int x ) { int count = -1; while ( x > 0 ) { count++; x = x >> 1; } return count; } int main() { cout << "Log base 2 for input x = 32 is: " << solve( 32 ) << endl; cout << "Log base 2 for input x = 1024 is: " << solve( 1024 ) << endl; cout << "Log base 2 for input x = 568 is: " << solve( 568 ) << endl; cout << "Log base 2 for input x = 1059 is: " << solve( 1059 ) << endl; }

输出

Log base 2 for input x = 32 is: 5
Log base 2 for input x = 1024 is: 10
Log base 2 for input x = 568 is: 9
Log base 2 for input x = 1059 is: 10

在这个输出中可以看到,对于最后两个输入,结果是整数格式,这些是实际以2为底的对数结果的地板值。因此,移位运算符只能用于基于整数的结果。

结论

可以使用基于cmath库的log2()方法计算以2为底的对数。这将返回整数或分数结果。另一种方法是使用另一个对数底数和一个小的对数公式,如第二节所示。我们讨论的第三种方法是使用位移运算符。我们将结果一次一位地向右移动,并在数字达到0时增加计数器以获得最终结果。这种方法更快,但仅当我们需要整数或地板值结果时才能很好地工作。在这个解决方案中,小数部分被删除了。我们还可以使用数值方法通过使用二分法、牛顿-拉夫森法或任何其他非线性方程求解方法来计算对数结果,以获得更精确的结果。

更新于:2022年10月17日

2K+ 次浏览

启动您的职业生涯

完成课程获得认证

开始
广告
© . All rights reserved.