Posso fazer aritmética com números complexos no awk e, em caso afirmativo, como?

2

O idioma AWK suporta aritmética para números complexos? Se sim, como defino uma unidade imaginária?

    
por mabalenk 04.04.2017 / 19:45

2 respostas

7

Você sempre pode definir números complexos como uma matriz de dois números (a parte real e a parte imaginária). Você precisaria definir todos os operadores aritméticos manualmente:

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)
}

Qual seria a saída:

(i) * (i) = (-1)
(1+2i) + (4i) = (1+6i)

Para idiomas com suporte nativo para números complexos, consulte:

  • python :

    $ python -c 'print(1j*1j)'
    (-1+0j)
    
  • octave :

    $ octave --eval 'i*i'
    ans = -1
    
  • calc ( apcalc package no Debian):

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

    $ $ Rscript -e '1i*1i'
    [1] -1+0i
    
por 04.04.2017 / 22:45
4

Não, o awk atualmente não suporta nativamente números complexos.

Vou apontar para a especificação POSIX para o awk , onde diz:

Each expression shall have either a string value, a numeric value, or both. Except as stated for specific contexts, the value of an expression shall be implicitly converted to the type needed for the context in which it is used. A string value shall be converted to a numeric value either by the equivalent of the following calls to functions defined by the ISO C standard:

setlocale(LC_NUMERIC, "");

numeric_value = atof(string_value);

or by converting the initial portion of the string to type double representation ...

e

In case (a) the numeric value of the numeric string shall be the value that would be returned by the strtod() call ...

... e apontando que atof e strtod ambos retornam um tipo de double .

    
por 04.04.2017 / 21:00

Tags