我可以在 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
    
  • calcapcalcDebian 上的软件包):

    $ calc '1i * 1i'
            -1
    
  • R

    $ $ Rscript -e '1i*1i'
    [1] -1+0i
    

答案2

不,awk 目前本身不支持复数。

我将指出awk 的 POSIX 规范它说:

每个表达式应具有字符串值、数值或两者。除非针对特定上下文另有规定,否则表达式的值应隐式转换为使用它的上下文所需的类型。应通过等效于以下 ISO C 标准定义的函数调用将字符串值转换为数值:

setlocale(LC_NUMERIC,“”);

数字值 = atof(字符串值);

或者通过将字符串的初始部分转换为双精度表示形式...

在情况 (a) 中,数字字符串的数值应为 strtod() 调用返回的值...

...并指出atofstrtod两者都返回double.

相关内容