데이터 타입 자동 변환

데이터 타입 자동 변환 (Automatic Conversion of Data Types)

많은 연산자와 함수가 서로 다른 데이터 타입을 섞어서 쓸 수 있어요. Octave는 이를 위해 MATLAB과 호환되는 규칙으로 타입을 자동 변환해요. 다만 모든 조합이 허용되는 건 아니고, 정해진 규칙에 따라 결과 타입이 달라진답니다.

출처: 문서

본문

많은 연산자와 함수가 혼합 데이터 타입으로 동작할 수 있어요. 예를 들어,

uint8 (1) + 1
    ⇒  2
single (1) + 1
    ⇒  2
min (single (1), 0)
   ⇒  0

결과 타입은 각각 uint8, single, single이에요. 이는 MATLAB 호환성을 위해 이렇게 동작해요. 허용되는 혼합 연산은 다음과 같이 정의돼요.

혼합 연산 (Mixed Operation) 결과 (Result)
double OP single single
double OP integer integer
double OP char double
double OP logical double
single OP integer integer
single OP char single
single OP logical single

함수가 double을 기대하는데 다른 타입이 전달되면, 자동 변환은 함수에 따라 달라져요.

a = det (int8 ([1 2; 3 4]))
    ⇒  a = -2
class (a)
    ⇒  double
a = eig (int8 ([1 2; 3 4]))
    ⇒  error: eig: wrong type argument 'int8 matrix'

det는 int8을 받아 double 결과를 내지만, eig는 int8 인자를 받지 못하고 오류를 던지는 걸 볼 수 있어요.

정수끼리의 연산

두 피연산자가 둘 다 정수인데 폭(bitwidth)이 다르면, 어떤 연산은 더 넓은 폭으로 변환하고 어떤 연산은 오류를 던져요.

a = min (int8 (100), int16 (200))
    ⇒  100
class (a)
    ⇒  int16
int8 (100) + int16 (200)
   ⇒  error: binary operator '+' not implemented
   for 'int8 scalar' by 'int16 scalar' operations

두 정수 피연산자는 보통 둘 다 부호 있거나 둘 다 부호 없어야 해요. 부호 있는 정수와 부호 없는 정수를 섞으면 같은 폭이라 해도 대개 오류가 발생해요.

min (int16 (100), uint16 (200))
   ⇒  error: min: cannot compute min (int16 scalar, uint16 scalar)

혼합 타입 인덱스 할당

혼합 타입으로 인덱스된 할당에서는 타입이 바뀌지 않아요. 예를 들어,

x = ones (2, 2);
x(1, 1) = single (2)
   ⇒  x = 2   1
          1   1

여기서 x는 배정밀도 타입을 유지해요. 할당을 통해 단정밀도 값을 넣어도 x의 타입은 그대로 남는 거죠.

더 알아보기

  • 데이터 타입의 종류는 Data Types 절을 참고하세요.
  • single 타입에 대한 내용은 Single Precision Data Types 절을 보세요.