2의 제곱(Math.pow)의 값을 구하고, 지수 (Math.Exponent)를 얻고, Math.log를 이용한 지수 구하는 식을 테스트해 본다.


Math.log() 메소드를 이용해서 테스트 했다.

for (int i = 0; i < 35; i++) {
double p = Math.pow(2, i);
System.out.println(i + ":" + p + "\t" + Math.getExponent(p) + "\t" + (Math.log(p)/Math.log(2)));
}


결과는 다음과 같다.

0:1.0 0 0.0

1:2.0 1 1.0

2:4.0 2 2.0

3:8.0 3 3.0

4:16.0 4 4.0

5:32.0 5 5.0

6:64.0 6 6.0

7:128.0 7 7.0

8:256.0 8 8.0

9:512.0 9 9.0

10:1024.0 10 10.0

11:2048.0 11 11.0

12:4096.0 12 12.0

13:8192.0 13 13.0

14:16384.0 14 14.0

15:32768.0 15 15.0

16:65536.0 16 16.0

17:131072.0 17 17.0

18:262144.0 18 18.0

19:524288.0 19 19.0

20:1048576.0 20 20.0

21:2097152.0 21 21.0

22:4194304.0 22 22.0

23:8388608.0 23 23.0

24:1.6777216E7 24 24.0

25:3.3554432E7 25 25.0

26:6.7108864E7 26 26.0

27:1.34217728E8  27 27.0

28:2.68435456E8         28 28.0

29:5.36870912E8  29 29.000000000000004

30:1.073741824E9 30 30.0

31:2.147483648E9 31 31.000000000000004

32:4.294967296E9 32 32.0

33:8.589934592E9 33 33.0

34:1.7179869184E10 34 34.0



사실은 다음을 테스트하고 싶었다. 정말 값을 비교했을 때, 조금 작은 double 값의 차이가 나더라도 적당하게 동일한 값이 나온다고 알려줄까?? 사실은 다른 값이라고 명확하게 알린다. 따라서 Math.getExponent의 값을 쓰는 것이 낫다. 

Math.log를 이용하면 근접한 값이 나올 수는 있지만(예, 29, 31의 값), 값을 비교 할 때, 다른 값이라고 판단될 수 있다. 



for (int i = 0; i < 35; i++) {
double p = Math.pow(2, i);
double logP = Math.log(p) / Math.log(2);
double expP = Math.getExponent(p);

String isEqualToIandLogP = "X";
if (i == logP) {
isEqualToIandLogP = "O";
}

String isEqualToIandExpP = "X";
if (i == expP) {
isEqualToIandExpP = "O";
}
System.out.println(i + ":" + p + "\t" + expP + "\t" + logP + "\t" + isEqualToIandLogP + "\t" + isEqualToIandExpP);
}


0:1.0 0.0 0.0 O O

1:2.0 1.0 1.0 O O

2:4.0 2.0 2.0 O O

3:8.0 3.0 3.0 O O

4:16.0 4.0 4.0 O O

5:32.0 5.0 5.0 O O

6:64.0 6.0 6.0 O O

7:128.0 7.0 7.0 O O

8:256.0 8.0 8.0 O O

9:512.0 9.0 9.0 O O

10:1024.0 10.0  10.0 O O

11:2048.0 11.0  11.0 O O

12:4096.0 12.0  12.0  O O

13:8192.0 13.0  13.0 O O

14:16384.0 14.0  14.0 O O

15:32768.0 15.0  15.0 O O

16:65536.0 16.0  16.0 O O

17:131072.0 17.0  17.0 O O

18:262144.0 18.0  18.0 O O

19:524288.0 19.0  19.0 O O

20:1048576.0 20.0  20.0   O O

21:2097152.0 21.0  21.0   O O

22:4194304.0 22.0  22.0   O O

23:8388608.0 23.0  23.0   O O

24:1.6777216E7 24.0  24.0   O O

25:3.3554432E7 25.0  25.0   O O

26:6.7108864E7 26.0  26.0   O O

27:1.34217728E8 27.0  27.0   O O

28:2.68435456E8 28.0  28.0   O O

29:5.36870912E8 29.0  29.000000000000004   X O

30:1.073741824E9 30.0  30.0   O O

31:2.147483648E9 31.0  31.000000000000004   X O

32:4.294967296E9 32.0 32.0   O O

33:8.589934592E9 33.0  33.0   O O

34:1.7179869184E10 34.0  34.0   O O


Posted by 김용환 '김용환'

댓글을 달아 주세요