awk에서 복소수에 대한 산술 연산을 수행할 수 있나요? 가능하다면 어떻게 해야 하나요?

awk에서 복소수에 대한 산술 연산을 수행할 수 있나요? 가능하다면 어떻게 해야 하나요?

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() 호출에서 반환된 값이어야 합니다...

... 그리고 주목atof그리고strtod둘 다 반환됩니다 double.

관련 정보