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+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始
廣告