허수 리터럴

허수 리터럴 (Imaginary Literals)

복소수를 다루려 할 때, 정수나 부동소수점 리터럴만으로는 허수부(imaginary part)를 표현할 수 없어요. 그래서 Go에는 허수부를 바로 나타내는 허수 리터럴(imaginary literal) 이 따로 있습니다. 정수 또는 부동소수점 리터럴 뒤에 소문자 i 하나만 붙이면 되죠.

출처: Go Specification

본문

허수 리터럴은 복소수 상수의 허수부를 나타내요. 형태를 보면 아주 단순한데, 정수 또는 부동소수점 리터럴 뒤에 소문자 i를 붙이면 돼요. 이 리터럴의 값은, 그 정수 또는 부동소수점 리터럴 값에 허수 단위(imaginary unit) i를 곱한 값이에요. (Go 1.13부터 지원돼요.)

EBNF로는 이렇게 정의돼요.

imaginary_lit = (decimal_digits | int_lit | float_lit) "i" .

즉, imaginary_litdecimal_digits, int_lit, float_lit 셋 중 하나 다음에 "i"가 오는 형태예요.

여기서 한 가지 알아두면 좋은 호환성(backward compatibility) 규칙이 있어요. 허수 리터럴의 정수 부분이 십진 자릿수(그리고 가능한 밑줄)로만 이루어져 있다면, 앞에 0이 붙어 있더라도 십진 정수로 취급돼요. 아래 예시로 실제로 어떤 값이 되는지 볼게요.

0i
0123i         // == 123i for backward-compatibility
0o123i        // == 0o123 * 1i == 83i
0xabci        // == 0xabc * 1i == 2748i
0.i
2.71828i
1.e+0i
6.67428e-11i
1E6i
.25i
.12345E+5i
0x1p-2i       // == 0x1p-2 * 1i == 0.25i

0123i123i와 같다고 나온 부분이 앞서 말한 호환성 규칙이에요. 앞의 0이 8진수를 의미하지 않고 십진 정수로 읽히는 거죠. 반면 0o123i0xabci처럼 명시적으로 진수를 표기한 경우에는 그 진수 값에 1i를 곱한 값이 돼요. 숫자 자체가 곧 허수부의 크기가 되는 구조다 보니, 리터럴 값에 1i를 곱한다고 이해하면 자연스럽게 읽힙니다.

더 알아보기