awkで複素数の算術演算を実行できますか?可能であればどうすればよいですか?

awkで複素数の算術演算を実行できますか?可能であればどうすればよいですか?

AWK言語は複雑な算術をサポートしていますか?それでは、虚数単位はどのように定義されますか?

答え1

複素数は、常に2つの数値(実数部と虚数部)の配列として定義できます。すべての算術演算子を手動で定義する必要があります。

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( apcalcDebian パッケージ):

    $ 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

関連情報