Just a Computer Graphics Studio & My Life

[C/C++] 換底公式使用log2

在資訊領域很常會用到以2為底數的log2,但是C/C++並沒有直接提供log2的函式,不過卻可以很簡單地以換底公式使用log()函式來達成log2的功用。

必須先#include<math.h>#include<cmath>才能使用log()函式。

/**
	Theme: log2
	Compiler: Dev C++ 4.9.9.2
	Date: 100/11/8
	Author: HappyMan
	Blog: https://cg2010studio.wordpress.com/
*/
#include<iostream>
#include<math.h>
using namespace std;

int main(){
	double answer1=0;
	double answer2=0;
	for(int i=1; i<=16; i++){
		answer1 = ceil(log(i+1) / log(2));
		answer2 = floor(log(i) / log(2))+1;
		cout<<"a1: "<<answer1<<" a2: "<<answer2<<endl;
	}
	system("pause");
	return 0;
}

這裡想展示⌊logn⌋+1⌈log(n+1)⌉兩者得差別,得到得結果一樣:

a1: 1 a2: 1
a1: 2 a2: 2
a1: 2 a2: 2
a1: 3 a2: 3
a1: 3 a2: 3
a1: 3 a2: 3
a1: 3 a2: 3
a1: 4 a2: 4
a1: 4 a2: 4
a1: 4 a2: 4
a1: 4 a2: 4
a1: 4 a2: 4
a1: 4 a2: 4
a1: 4 a2: 4
a1: 4 a2: 4
a1: 5 a2: 5
請按任意鍵繼續 . . .

其實無論以任何數為底,都可以使用log(i) / log(2),只要把2改成你想要的底數即可。

哈~不知道為何我寫這篇文章時,會認為log2和log10不存在?偶然看到他人程式碼中有使用到,便馬上拿來測試,居然可耶!?而且IDE一樣,到底當時的我哪裡有洞呢:P

/**
	Theme: log
	Compiler: Dev C++ 4.9.9.2
	Date: 102/01/06
	Author: HappyMan
	Blog: https://cg2010studio.wordpress.com/
*/
#include<iostream>
#include<cmath>
using namespace std;

int main(){
	cout<<log(7.0)/log(10.0)<<endl;
	cout<<log10(7.0)<<endl;

	cout<<log(10.0)/log(2.0)<<endl;
	cout<<log2(10.0)<<endl;

	system("pause");
	return 0;
}

執行結果:

0.845098
0.845098
3.32193
3.32193
請按任意鍵繼續 . . .

廣告

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: