지난 시간에는 정수형 I 기술자(Descriptor)를 사용하여 포맷(Format)을 지정하여 출력하는 방법에 관하여 알아보았습니다. 오늘은 실수형 F 기술자에 관하여 알아보기로 하겠습니다. 실수형 값에 대하여 사용되는 F 기술자는 기본적으로 다음과 같은 형식을 갖습니다.
Fw.m
여기서 w는 필드의 크기이고 m은 소수점 아래의 자릿수의 갯수입니다. 필드(Field)의 크기라는 개념은 지난번에 정수형 I 기술자에서 언급된 개념과 같습니다. 즉, 서식을 위하여 할당되는 한 칸의 공간을 하나의 필드라고 합니다. 그런데 F 기술자에서 유념할 점은 전체 필드들 중 소수점 이하 자릿수들 및 소수점이 모두 각자 필드 공간을 점유하게 된다는 것입니다. 그래서 필드의 크기는 적어도 소수점 자릿수+1보다는 커야 합니다. 이 설명에 대해서는 다음 그림을 보면 좀 더 이해가 쉬울 것 같습니다.
그리고 F 기술자에서 지정된 소수점 자릿수는 무조건 지켜지기 때문에 여유 공간에는 0을 채워넣는다는 점, 그리고 (-) 부호 역시 엄연히 하나의 필드를 차지한다는 점 등을 추가적으로 염두에 두면 크게 어려울 것은 없습니다. 결국 F 기술자를 사용할 때 가장 유념해야 할 부분은 소수점 앞부분, 소수점 뒷부분, 소수점, 부호 등을 모두 커버할 수 있을 정도의 충분한 필드 크기를 확보해야 한다는 점이 될 것입니다. 예를 들어, -13.64라는 실수를 기술할 수 있는 F 기술자는 소수점 앞부분은 적어도 두 칸 이상, 소수점 뒷부분은 적어도 두 칸 이상이 필요하고, 소수점 및 부호까지 고려를 해야합니다. 따라서 전체 필드 크기는 적어도 2+2+1+1=6 이상은 되어줘야하겠지요. 즉, 최소한 F6.2 정도는 되어줘야 한단 얘기가 됩니다. 물론 이보다 더 여유로와도 상관은 없습니다. F7.3, F8.3 등등은 다 가능합니다. 필요에 따라 선택하면 됩니다. 다음은 지금까지 설명된 내용에 따라 IDL에서 실제로 출력을 해본 결과입니다.
IDL> PRINT, 7.5, FORMAT='(F6.3)'
7.500
IDL> PRINT, 0.182, FORMAT='(F6.3)'
0.182
IDL> PRINT, -4.872, FORMAT='(F6.3)'
-4.872
IDL> PRINT, -13.64, FORMAT='(F6.2)'
-13.64
그러나, 반대로 생각해본다면, -13.64라는 값을 기술하는데 있어서 F6.2보다도 모자라면 문제가 됩니다. 만약 F6.1이라면 소수점 뒷부분의 한 자리 정보를 잃게 되고, F5.2라면 소수점 앞부분의 자릿수 자체가 모자라기 때문에 아예 기술 자체가 안되는 심각한 문제가 발생합니다. 이러한 문제에 대해서는 다음 그림을 보면 아마 이해가 더 빠를 것 같습니다.
이 그림에서 먼저 주목할 부분은, F 기술자의 소수점 자릿수가 원래 값의 소수점 자릿수보다 모자랄 경우에는 알아서 반올림을 해버린다는 점입니다. 하여간 기술자의 소수점 자리가 모자라는 경우는 이와 같은 약간의 정보 손실만 있을 뿐 값 자체의 표시는 그래도 진행이 됩니다. 그러나 소수점 앞부분의 자릿수가 충분하지 않을 경우는 더 심각한 문제가 발생합니다. 아예 값 표시 자체가 진행이 안됩니다. 아무래도 소수점 앞부분 자릿수는 값 자체의 본질을 좌우하는 부분이기 때문에 더 엄격하게 처리가 되는 것 같습니다. 다음은 지금까지 설명된 내용에 따라 IDL에서 실제로 출력을 해본 결과입니다.
IDL> PRINT, 13.724, FORMAT='(F6.2)'
13.72
IDL> PRINT, 13.728, FORMAT='(F6.2)'
13.73
IDL> PRINT, -254.32, FORMAT='(F6.2)'
******
IDL> PRINT, -13.64, FORMAT='(F6.1)'
-13.6
IDL> PRINT, -13.64, FORMAT='(F5.2)'
*****
그럼 여기서 좀 더 실질적인 실수값 활용 예제를 한번 살펴봅시다. 우리가 야구에서 타율을 계산하여 표시할 때에 항상 소수점 아래로 세째 자리까지 나타내는 것이 관례입니다. 만약 어떤 타자의 기록이 148타수 45안타라고 한다면, 타율은 45/148을 계산하여 소수점 세째 자리까지 나타내면 됩니다. 그렇다면 타율이란 값을 표시하기에 적합한 F기술자는 무엇이 되면 좋을까 생각을 해볼 수 있는데, 아마도 F5.3 정도면 가장 무난한 서식이 아닐까 생각이 듭니다. 따라서 이러한 계산을 수행하고 그 결과를 내가 원하는 서식에 맞게 출력하려면 IDL에서는 대략 다음과 같은 방식으로 하면 됩니다.
IDL> PRINT, FLOAT(45)/148, FORMAT='(F5.3)'
0.304
여기서 FLOAT라는 형변환 함수를 사용한 이유는 원래 타수나 안타수라는 값들이 그 특성상 정수로 나오는 값들이기 때문에 계산에 있어서는 어느 한 쪽을 실수로 변환을 해줘야 우리가 원하는 실수 기반의 연산이 이루어지기 때문입니다. 특히 다음과 같이 배열의 형태로 데이터가 존재할 경우라면 이와 같은 방법은 거의 필수적이라고 볼 수 있습니다.
IDL> hits = [37, 49, 28, 41, 53]
IDL> atbats = [144, 156, 139, 158, 147]
IDL> avgs = FLOAT(hits)/atbats
IDL> FOR i = 0, N_ELEMENTS(avgs)-1 DO PRINT, avgs[i], FORMAT='(F5.3)'
0.257
0.314
0.201
0.259
0.361
오늘은 실수형 F 기술자를 이용한 출력 및 간단한 활용에 관한 내용을 다뤄보았습니다. FORMAT 코드에 관한 내용은 다음에도 계속이어질 예정입니다.
'IDL > Programming' 카테고리의 다른 글
| IDL에서 Carriage Return을 사용한 문자 표기 방법 (0) | 2015.08.25 |
|---|---|
| 금성과 목성의 만남 2015 (링크) (0) | 2015.07.06 |
| 포맷(Format) 코드의 이해 [1] (0) | 2015.06.18 |
| WHERE 함수의 결과가 -1일 경우의 유의사항 (0) | 2015.06.08 |
| LAMBDA, LAMBDAP 함수 소개 [2] (0) | 2015.02.04 |