Saturday, January 20, 2007
Java/자바] log2 (밑이 2인 로그 함수), log (ln), log10(상용 로그) 구하기
자바에는 자연로그(Natural Logarithm)를 구하는 log() 함수와, 밑(Base)이 10인 상용 로그를 구하는 log10() 함수만 있기에,
밑이 2인 로그 등을 구하려면 직접 함수를 만들어야 합니다. 아래 예제에 logB() 라는 메소드(함수)가 있는데
logB(숫자, 밑)
이런 형식으로 임의의 실수를 밑으로 지정할 수 있습니다.
파일명: Foo.java
위의 예제 컴파일 및 실행 결과 화면:
▶▶ Java/자바] 자연 로그의 밑 e 상수 구하기 출력; Natural Logarithm, Euler Constant
로그 계산기: ▶▶ 로그계산기; 로그값 구하기; 상용로그, 자연로그, 밑이 2인 로그; Log Calc
실행 결과 화면:
밑이 2인 로그 등을 구하려면 직접 함수를 만들어야 합니다. 아래 예제에 logB() 라는 메소드(함수)가 있는데
logB(숫자, 밑)
이런 형식으로 임의의 실수를 밑으로 지정할 수 있습니다.
자연로그, 상용로그, 밑(Base)이 2인 로그 계산 예제
파일명: Foo.java
public class Foo {
public static void main(String[] args) {
System.out.format(" 자연 로그 :%n%n");
for (double d = 1.0; d <= 10.0; d++)
System.out.format(" ln(%2.0f) = %.16f%n", d, Math.log(d));
System.out.format("%n%n%n 상용 로그 :%n%n");
for (double d = 1.0; d <= 10.0; d++)
System.out.format("log10(%2.0f) = %.16f%n", d, Math.log10(d));
System.out.format("%n%n%n 밑이 2인 로그 :%n%n");
for (double d = 1.0; d <= 10.0; d++)
System.out.format(" log2(%2.0f) = %.16f%n", d, logB(d, 2.0));
}
public static double logB(double x, double base) {
return Math.log(x) / Math.log(base);
}
}
public static void main(String[] args) {
System.out.format(" 자연 로그 :%n%n");
for (double d = 1.0; d <= 10.0; d++)
System.out.format(" ln(%2.0f) = %.16f%n", d, Math.log(d));
System.out.format("%n%n%n 상용 로그 :%n%n");
for (double d = 1.0; d <= 10.0; d++)
System.out.format("log10(%2.0f) = %.16f%n", d, Math.log10(d));
System.out.format("%n%n%n 밑이 2인 로그 :%n%n");
for (double d = 1.0; d <= 10.0; d++)
System.out.format(" log2(%2.0f) = %.16f%n", d, logB(d, 2.0));
}
public static double logB(double x, double base) {
return Math.log(x) / Math.log(base);
}
}
위의 예제 컴파일 및 실행 결과 화면:
D:\Z>javac Foo.java && java Foo
자연 로그 :
ln( 1) = 0.0000000000000000
ln( 2) = 0.6931471805599453
ln( 3) = 1.0986122886681096
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.3025850929940460
상용 로그 :
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.5849625007211560
log2( 4) = 2.0000000000000000
log2( 5) = 2.3219280948873620
log2( 6) = 2.5849625007211560
log2( 7) = 2.8073549220576040
log2( 8) = 3.0000000000000000
log2( 9) = 3.1699250014423126
log2(10) = 3.3219280948873626
D:\Z>
자연 로그 :
ln( 1) = 0.0000000000000000
ln( 2) = 0.6931471805599453
ln( 3) = 1.0986122886681096
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.3025850929940460
상용 로그 :
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.5849625007211560
log2( 4) = 2.0000000000000000
log2( 5) = 2.3219280948873620
log2( 6) = 2.5849625007211560
log2( 7) = 2.8073549220576040
log2( 8) = 3.0000000000000000
log2( 9) = 3.1699250014423126
log2(10) = 3.3219280948873626
D:\Z>
▶▶ Java/자바] 자연 로그의 밑 e 상수 구하기 출력; Natural Logarithm, Euler Constant
로그 계산기: ▶▶ 로그계산기; 로그값 구하기; 상용로그, 자연로그, 밑이 2인 로그; Log Calc
자연로그의 합계 구하기 예제
파일명: Foo.javaimport java.util.Scanner;
public class Foo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
System.out.print("구할 값을 입력하시오: ");
int num = scan.nextInt();
double sum = 0;
System.out.println();
for (double d = 1.0; d <= num; d++) {
sum = sum + Math.log(d);
System.out.format("ln(%4.0f) = %.16f%n", d, Math.log(d));
}
System.out.format("%nln(1)에서 ln("+num+")까지의 sum은 " + sum + " 입니다.%n");
}
}
public class Foo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
System.out.print("구할 값을 입력하시오: ");
int num = scan.nextInt();
double sum = 0;
System.out.println();
for (double d = 1.0; d <= num; d++) {
sum = sum + Math.log(d);
System.out.format("ln(%4.0f) = %.16f%n", d, Math.log(d));
}
System.out.format("%nln(1)에서 ln("+num+")까지의 sum은 " + sum + " 입니다.%n");
}
}
실행 결과 화면:
D:\Z>javac Foo.java && java Foo
구할 값을 입력하시오: 10
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.3025850929940460
ln(1)에서 ln(10)까지의 sum은 15.104412573075518 입니다.
D:\Z>
구할 값을 입력하시오: 10
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.3025850929940460
ln(1)에서 ln(10)까지의 sum은 15.104412573075518 입니다.
D:\Z>
tag: java
자바 | Java
흠 혹시 Math.log(1000) / Math.log(10) 하면
2.9999999999999996 이렇게 나오지는 않겠죠..?
2.9999999999999996 로 나오는 것은
System.out.format 의 정밀도가 16 이기 때문입니다.
3.00000000 으로 출력되게 하려면
정밀도를 8 정도로 %.8f 이렇게 하시면 됩니다.
예제::
public class Foo {
public static void main(String[] args) {
double d = Math.log(1000) / Math.log(10);
System.out.format("%.16f%n", d);
// 2.9999999999999996
System.out.format("%.8f%n", d);
// 3.00000000
}
}
올려주신 자료로 ln(1)부터 ln(1000)까지 구하는 스크립트를 썼습니다.
궁금한 점은
ln(1)부터 ln(1000)까지 계산되어 나오는 각각의 값들을
누적더하기를 해야하는데
어떻게 해야할지 모르겠어서 질문 남깁니다.
아래는 제 생각으로 짜본건데 아예 오류부터 떠버리네요..
import java.util.Scanner;
public class Factorial {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
System.out.println("구할 값을 입력하시오.: ");
int num = scan.nextInt();
for (double d = 1.0; d <= num; d++)
System.out.format("ln(%2.0f) = %.16f%n", d, Math.log(d));
double sum = 0;
sum = sum + %.16f%n;
System.out.println("ln("+num+"!"+")의 sum은" + sum + "입니다.");
}
}
포스트 본문 끝에, 합계 구하기 소스를 업로드했습니다
대학교 수업 과제인데 처음 하는거라 쩔쩔매고 있었습니다.
작성자님의 로그 구하는 포스팅과 또 친절하게 합계까지 구하는 법을 알려주셔서 진심으로 감사드립니다.
마지막으로 부탁드려보자 하는 심정으로 댓글은 단 거였는데.. 너무 감사드립니다.
<< Home