AWK 언어는 복잡한 산술을 지원합니까? 그렇다면 허수단위는 어떻게 정의되는가?
답변1
복소수는 항상 두 숫자(실수부와 허수부)의 배열로 정의할 수 있습니다. 모든 산술 연산자를 수동으로 정의해야 합니다.
function cset(x, real, imaginary) {
x["real"] = real
x["imaginary"] = imaginary
}
function cadd(n1, n2, result) {
result["real"] = n1["real"] + n2["real"]
result["imaginary"] = n1["imaginary"] + n2["imaginary"]
}
function cmult(n1, n2, result) {
result["real"] = n1["real"] * n2["real"] - n1["imaginary"] * n2["imaginary"]
result["imaginary"] = n1["real"] * n2["imaginary"] + n2["real"] * n1["imaginary"]
}
function c2a(x, tmp) {
if (x["real"]) {
tmp = x["real"]
if (x["imaginary"] > 0) tmp = tmp "+"
}
if (x["imaginary"]) {
if (x["imaginary"] == -1) tmp = tmp "-i"
else if (x["imaginary"] == 1) tmp = tmp "i"
else tmp = tmp x["imaginary"] "i"
}
if (tmp == "") tmp = "0"
return "(" tmp ")"
}
BEGIN {
cset(i, 0, 1)
cmult(i, i, i2)
printf "%s * %s = %s\n", c2a(i), c2a(i), c2a(i2)
cset(x, 1, 2)
cset(y, 0, 4)
cadd(x, y, xy)
printf "%s + %s = %s\n", c2a(x), c2a(y), c2a(xy)
}
그러면 다음이 출력됩니다.
(i) * (i) = (-1)
(1+2i) + (4i) = (1+6i)
기본적으로 복수형을 지원하는 언어는 다음을 참조하세요.
python
:$ python -c 'print(1j*1j)' (-1+0j)
octave
:$ octave --eval 'i*i' ans = -1
calc
(apcalc
데비안 패키지):$ calc '1i * 1i' -1
R
:$ $ Rscript -e '1i*1i' [1] -1+0i
답변2
아니요, awk는 현재 기본적으로 복수형을 지원하지 않습니다.
나는 지적할 것이다awk에 대한 POSIX 사양그것은 말한다:
각 표현식에는 문자열 값, 숫자 값 또는 둘 다가 있어야 합니다. 특정 컨텍스트에 대해 달리 지정하지 않는 한, 표현식의 값은 그것이 사용되는 컨텍스트에서 요구하는 유형으로 암시적으로 변환됩니다. 문자열 값은 다음 ISO C 표준 정의에 해당하는 함수 호출을 통해 숫자 값으로 변환되어야 합니다.
setlocale(LC_NUMERIC, "");
숫자값 = atof(문자열 값);
또는 문자열의 초기 부분을 이중 표현으로 변환하여...
그리고
(a)의 경우 숫자 문자열의 숫자 값은 strtod() 호출에서 반환된 값이어야 합니다...