데이터 타입 자동 변환
데이터 타입 자동 변환 (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 절을 보세요.