컴퓨터 엑셀 워드 포토숍 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Previous Post Perl/펄] log (ln), log10, log2, 상용 로그 함수, 밑이 10, 2인...Python/파이썬] log (ln), log10, log2, 로그 함수 [밑이 2인 로그...Perl/펄] 문자열/배열 양쪽 공백 제거, 정규식 사용; Trim Leading / Tr...Python/파이썬] 문자열 앞이나 끝의 공백만 제거; Remove Leading-Trai...C언어] 오늘 요일 이름 구하기, 요일명 출력; Get-Print DAY OF THE WE...Python/파이썬] 오늘 요일 이름 구하기, 요일명 출력; Get-Print DAY OF...Python/파이썬] 문자열 양쪽의 불필요한 공백 제거; Trim Trailing Spac...Python/파이썬] 정수 실수 자료형, 숫자 데이터형; int long float Num...자바스크립트] 한국식 날짜/시간 문자열 출력; 타임 스탬프 찍기; JavaScript YY...Java/자바] BigInteger 형 정수 숫자, if문으로 크기 비교; Compare ...

C언어] log2 (밑이 2인 로그 함수), log (ln), log10(상용 로그) 구하기

Saturday, January 20, 2007

C에는 자연로그(Natural Logarithm)를 구하는 log() 함수와, 밑(Base)이 10인 상용 로그를 구하는 log10() 함수만 있기에,

밑이 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);
}



위의 예제 컴파일 및 실행 결과 화면:
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>



▶▶ C언어] 자연 로그의 밑 e 상수 출력 사용법; Natural Logarithm, Euler Constant, M_E

로그 계산기: ▶▶ 로그계산기; 로그값 구하기; 상용로그, 자연로그, 밑이 2인 로그; Log Calc

2 Comments:
At 1:42 PM, Blogger Unknown said...

floating point 정확도 문제도 고려해 볼 수 있을 것 같습니다.
http://stackoverflow.com/questions/994593/how-to-do-an-integer-log2-in-c

 
At 2:32 PM, Blogger mwultong said...


* "매스매티카(Mathematica)"로 log2(10)을 소수점 31자리까지 구한 결과:
N[Log[2, 10], 32]
= 3.3219280948873623478703194294894


* 위의 C소스 출력값:
log2(10) = 3.3219280948873626


결론: C소스로 구한 값이, 매스매티카로 구한 값의 소수점 15자리까지 일치합니다.
따라서 실용적인 경우에는 C로도 충분히 정밀한 값이 계산됩니다.

 

Post a Comment

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Categories
Previous Posts
Monthly Archives
Top