실수형 데이터
기본적으로 Scilab에서 숫자는 배정도 (C 언어의 double형, 8바이트) 실수형이며 단정도 (C 언어의 float형) 실수는 사용되지 않는다. Scilab뿐만 아니라 다른 수치해석 프로그램에서도 계산 결과의 정밀도가 중요하기 때문에 보통 실수는 정확도가 가장 높은 배정도 실수형으로 다룬다. 따라서 다음과 같이 입력하면 변수 x에 저장되는 수는 보기에는 정수이지만 내부적으로는 double형 실수이며 8바이트가 할당된다.
>> x = 1 |
이러한 배정도 실수형의 유효 자리는 보통 16자리인데 실용적인 공학 문제를 다룰 때는 대부분의 경우 크게 문제가 되지 않는다. 또한 배정도 실수형으로 다룰 수 있는 정수의 범위는 ~ 이며 이 범위 안에서의 정수 연산은 항상 정확한 값을 가진다. 그러나 이 범위 밖의 정수 연산은 오차가 발생하게 된다.
보통은 Scilab을 작성할 때는 주로 실수형 데이터를 사용하고 정수형은 사용 빈도가 실수형에 비해서 낮지만 정수형 데이터에 대해서도 설명하도록 하겠다.
정수형 데이터
배정도 실수 외에 정수형으로 데이터를 변환할 수 있으며 정수형을 다시 double형으로 바꿀 수도 있는데 관련된 함수는 다음과 같다.
[표 1] 숫자형의 변환에 관련된 함수들
함수
|
기능
|
double(M)
|
정수형 행렬 M을 배정도 실수형으로 변환
|
int8(A)
|
행렬 A를 8비트 부호 있는 정수형으로 변환
|
int16(A)
|
행렬 A를 16비트 부호 있는 정수형으로 변환
|
int32(A)
|
행렬 A를 32비트 부호 있는 정수형으로 변환
|
uint8(A)
|
행렬 A를 8비트 부호 없는 정수형으로 변환
|
uint16(A)
|
행렬 A를 16비트 부호 없는 정수형으로 변환
|
uint32(A)
|
행렬 A를 32비트 부호 없는 정수형으로 변환
|
iconvert(M, itype)
|
행렬 M을 특정한 형식으로 변환한다.
itype = 0 : 배정도 실수형
itype = 1 : int8 형, itype = 11 : uint8 형
itype = 2 : int16 형, itype = 12 : uint16 형
itype = 4 : int32 형, itype = 14 : uint32 형
|
inttype(M)
|
행렬 M의 데이터형을 반환한다. 반환값은 다음과 같다.
0 : 배정도 실수형, 1 : int8 형, 11 : uint8 형, 2: int16 형, 12 : uint16 형, 4 : int32 형, 14 : uint32 형
|
각 정수형의 숫자 범위는 다음과 같다.
- 부호가 있는 n비트 정수의 범위: ~
- 부호가 없는 n비트 정수의 범위: 0 ~
따라서 만약 정수형을 사용한다면 이 범위를 고려해서 프로그래밍을 해야 한다. 연산 결과가 이 범위를 넘어갈 경우 의도하지 않은 결과가 발생함을 다음 예에서 보이고 있다.
만약 두 정수를 더하는데 서로 자료형이 다르다면 그 결과값은 큰 쪽의 데이터형으로 맞춰진다. 즉, 8비트 정수형과 16비트 정수형을 더하면 그 결과는 16비트 정수형이 된다. 다음 예는 그 사실을 보여주고 있다. 하지만 정수형과 실수형을 연산하면 그 결과는 정수형이 되는 것에도 유의해야 한다.
Scilab의 정수형은 순환값을 가진다.(circular integers) 이것은 정수가 상한을 넘게되면 하한값을 가지게 되고 반대로 하한값보다 더 작아지면 상한값을 가지게 된다는 의미이다. 예를 들어 int8 형의 상한값은 127이며 여기에 1을 더하면 128이 되지 못하고 하한인 -128값을 가지게 된다. 다른 예로 uint16 의 하한 값은 부호 없는 정수이므로 0인데 여기서 1을 빼게 되면 상한인 65535 가 된다는 것이다.
이에 반해서 Matlab이나 Octave에서의 정수형은 허용범위를 넘어서면 순환하는 것이 아니라 거기에서 멈춘 값을 가진다. 즉 int8(127)+1 은 상한인 127이 되며 uint16(0)-1은 0이 된다. 만약 Scilab 코드를 Matlab이나 Octave로 이식하는 경우 혹은 그 반대의 경우 유의해야 한다.
댓글 없음:
댓글 쓰기