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
'java core' 카테고리의 다른 글
[java8] 배열을 java8 stream 처리하기 (0) | 2015.09.24 |
---|---|
Java8의 ArrayList.subList()한후 Iterate시 ConcurrentModificationException 발생 (0) | 2015.08.08 |
Math.nextUp, Math.nextAfter, Math.ulp 공부 (0) | 2015.07.18 |
[Java8] slf4j logger를 Streams.forEach 사용시 에러 발생 처리 방법(peek) (0) | 2015.07.09 |
[Java8] Function과 Stream을 이용한 객체 복사 테스트 예제 (0) | 2015.07.04 |