Saturday, January 20, 2007
C언어] log2 (밑이 2인 로그 함수), log (ln), log10(상용 로그) 구하기
C에는 자연로그(Natural Logarithm)를 구하는 log() 함수와, 밑(Base)이 10인 상용 로그를 구하는 log10() 함수만 있기에,
밑이 2인 로그 등을 구하려면 직접 함수를 만들어야 합니다. 아래 예제에 logB() 라는 함수가 있는데
logB(숫자, 밑)
이런 형식으로 임의의 실수를 밑으로 지정할 수 있습니다.
파일명: 0.cpp
위의 예제 컴파일 및 실행 결과 화면:
▶▶ C언어] 자연 로그의 밑 e 상수 출력 사용법; Natural Logarithm, Euler Constant, M_E
로그 계산기: ▶▶ 로그계산기; 로그값 구하기; 상용로그, 자연로그, 밑이 2인 로그; Log Calc
밑이 2인 로그 등을 구하려면 직접 함수를 만들어야 합니다. 아래 예제에 logB() 라는 함수가 있는데
logB(숫자, 밑)
이런 형식으로 임의의 실수를 밑으로 지정할 수 있습니다.
C에서, 자연로그, 상용로그, 밑(Base)이 2인 로그 계산 예제
파일명: 0.cpp
#include <stdio.h>
#include <math.h>
double logB(double x, double base);
int main(void) {
puts(" 자연 로그 :\n");
for (double d = 1.0; d <= 10.0; d++)
printf(" ln(%2.0f) = %.16f\n", d, log(d));
puts("\n\n\n 상용 로그 :\n");
for (double d = 1.0; d <= 10.0; d++)
printf("log10(%2.0f) = %.16f\n", d, log10(d));
puts("\n\n\n 밑이 2인 로그 :\n");
for (double d = 1.0; d <= 10.0; d++)
printf(" log2(%2.0f) = %.16f\n", d, logB(d, 2.0));
return 0;
}
double logB(double x, double base) {
return log(x) / log(base);
}
#include <math.h>
double logB(double x, double base);
int main(void) {
puts(" 자연 로그 :\n");
for (double d = 1.0; d <= 10.0; d++)
printf(" ln(%2.0f) = %.16f\n", d, log(d));
puts("\n\n\n 상용 로그 :\n");
for (double d = 1.0; d <= 10.0; d++)
printf("log10(%2.0f) = %.16f\n", d, log10(d));
puts("\n\n\n 밑이 2인 로그 :\n");
for (double d = 1.0; d <= 10.0; d++)
printf(" log2(%2.0f) = %.16f\n", d, logB(d, 2.0));
return 0;
}
double logB(double x, double base) {
return log(x) / log(base);
}
위의 예제 컴파일 및 실행 결과 화면:
D:\Z>cl 0.cpp && 0.exe
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
0.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.
/out:0.exe
0.obj
자연 로그 :
ln( 1) = 0.0000000000000000
ln( 2) = 0.6931471805599453
ln( 3) = 1.0986122886681098
ln( 4) = 1.3862943611198906
ln( 5) = 1.6094379124341003
ln( 6) = 1.7917594692280550
ln( 7) = 1.9459101490553132
ln( 8) = 2.0794415416798357
ln( 9) = 2.1972245773362196
ln(10) = 2.3025850929940459
상용 로그 :
log10( 1) = 0.0000000000000000
log10( 2) = 0.3010299956639812
log10( 3) = 0.4771212547196624
log10( 4) = 0.6020599913279624
log10( 5) = 0.6989700043360189
log10( 6) = 0.7781512503836436
log10( 7) = 0.8450980400142568
log10( 8) = 0.9030899869919435
log10( 9) = 0.9542425094393249
log10(10) = 1.0000000000000000
밑이 2인 로그 :
log2( 1) = 0.0000000000000000
log2( 2) = 1.0000000000000000
log2( 3) = 1.5849625007211563
log2( 4) = 2.0000000000000000
log2( 5) = 2.3219280948873626
log2( 6) = 2.5849625007211561
log2( 7) = 2.8073549220576042
log2( 8) = 3.0000000000000000
log2( 9) = 3.1699250014423126
log2(10) = 3.3219280948873626
D:\Z>
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
0.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.
/out:0.exe
0.obj
자연 로그 :
ln( 1) = 0.0000000000000000
ln( 2) = 0.6931471805599453
ln( 3) = 1.0986122886681098
ln( 4) = 1.3862943611198906
ln( 5) = 1.6094379124341003
ln( 6) = 1.7917594692280550
ln( 7) = 1.9459101490553132
ln( 8) = 2.0794415416798357
ln( 9) = 2.1972245773362196
ln(10) = 2.3025850929940459
상용 로그 :
log10( 1) = 0.0000000000000000
log10( 2) = 0.3010299956639812
log10( 3) = 0.4771212547196624
log10( 4) = 0.6020599913279624
log10( 5) = 0.6989700043360189
log10( 6) = 0.7781512503836436
log10( 7) = 0.8450980400142568
log10( 8) = 0.9030899869919435
log10( 9) = 0.9542425094393249
log10(10) = 1.0000000000000000
밑이 2인 로그 :
log2( 1) = 0.0000000000000000
log2( 2) = 1.0000000000000000
log2( 3) = 1.5849625007211563
log2( 4) = 2.0000000000000000
log2( 5) = 2.3219280948873626
log2( 6) = 2.5849625007211561
log2( 7) = 2.8073549220576042
log2( 8) = 3.0000000000000000
log2( 9) = 3.1699250014423126
log2(10) = 3.3219280948873626
D:\Z>
▶▶ C언어] 자연 로그의 밑 e 상수 출력 사용법; Natural Logarithm, Euler Constant, M_E
로그 계산기: ▶▶ 로그계산기; 로그값 구하기; 상용로그, 자연로그, 밑이 2인 로그; Log Calc
tag: cpp
C언어 | C/C++ (Visual C++)
floating point 정확도 문제도 고려해 볼 수 있을 것 같습니다.
http://stackoverflow.com/questions/994593/how-to-do-an-integer-log2-in-c
* "매스매티카(Mathematica)"로 log2(10)을 소수점 31자리까지 구한 결과:
N[Log[2, 10], 32]
= 3.3219280948873623478703194294894
* 위의 C소스 출력값:
log2(10) = 3.3219280948873626
결론: C소스로 구한 값이, 매스매티카로 구한 값의 소수점 15자리까지 일치합니다.
따라서 실용적인 경우에는 C로도 충분히 정밀한 값이 계산됩니다.
<< Home