Могу ли я выполнять арифметику с комплексными числами в awk, и если да, то как?

find . -iname '*.csv' | xargs -I {} tail -n 52 "{}" \| head -n 51 > polls.csv

Хотя вам, вероятно, следует использовать grep вместо head и tail.

2
04.04.2017, 21:22
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 ' напечатать(1j*1j)'
    (-1+0j)
     
  • octave:

     $ octave --eval 'i*i'
    ответ = -1
     
  • calc (пакет apcalc в Debian):

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

     $ $ Rscript -e '1i*1i'
    [1] -1+0i
     
7
27.01.2020, 21:49

Нет, в настоящее время awk изначально не поддерживает комплексные числа.

Я укажу на спецификацию POSIX для awk , где сказано:

Каждое выражение должно иметь строковое значение, числовое значение или и то, и другое. За исключением случаев, указанных для конкретных контекстов, значение выражения должно быть неявно преобразовано в тип, необходимый для контекста, в котором оно используется. Строковое значение должно быть преобразовано в числовое значение либо эквивалентом следующих вызовов функций, определенных стандартом ISO C:

setlocale (LC_NUMERIC, "");

numeric_value = atof (string_value);

] или преобразованием начальной части строки в представление типа double ...

и

В случае (а) числовое значение числовой строки должно быть значением, которое будет возвращено вызовом strtod () ...

... и указывая, что atof и strtod оба возвращают тип double .

4
27.01.2020, 21:49

Теги

Похожие вопросы