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

Поддерживает ли язык AWK арифметику для сложных чисел? Если да, как определить мнимую единицу?

2 Solutions collect form web for “Могу ли я сделать арифметику с комплексными числами в awk, и если да, то как?”

Вы всегда можете определить комплексные числа как массив из двух чисел (действительную и мнимую часть). Вам нужно будет определить все операторы арифметики вручную:

 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 на Debian):

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

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

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

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

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

setlocale (LC_NUMERIC, "");

numeric_value = atof (string_value);

или путем преобразования начальной части строки для двойного представления типа …

а также

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

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

  • убить несколько процессов с помощью awk-инструментов
  • помочь построить grep-выход
  • Печать строк между двумя шаблонами, соответствующими условию в awk
  • Извлечь имя группы из `id` и сохранить ее в переменной
  • Простая команда AWK для проверки правильности написания пути к каталогу
  • Объединение нескольких файлов с присоединением
  • Как извлечь значения, которые меньше 0 и точка из определенных столбцов, и распечатать всю строку с помощью awk
  • Выбор двух наборов условий в awk
  • Как удалить текст, сопоставляющий определенные шаблоны из файла
  • Показывать сумму файлов в списке каталогов
  • Фильтрация вывода tcpdump и запуска скрипта, когда строка найдена в реальном времени
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.