Обозначение комплексного числа - PullRequest
0 голосов
/ 21 сентября 2009

В моем приложении DotNET имеется ограниченный встроенный язык сценариев (свободно смоделированный на VBScript), в основном для постобработки чисел, точек и векторов. Я только что добавил поддержку комплексных чисел, но я борюсь с обозначениями.

Я не хочу использовать нотацию A + Bi, поскольку нет четкого разделения, если A или B уже определены как уравнения:

31 * 5 + 6 + -5i

Это можно интерпретировать как:

A = 31 * 5 + 6 B = -5i

и

A = 31 * 5 B = 6 + -5i

Ни один из известных мне языков программирования не имеет встроенной поддержки комплексных чисел. Я думаю, что-то вроде следующего может сработать, но я был бы признателен за любой вклад по этому вопросу:

{31 * 5} + {6 + -5} i

комплекс (31 * 5, 6 + -5)

r {31 * 5} i {6 + -5}

Ответы [ 4 ]

2 голосов
/ 21 сентября 2009

Если вы хотите просто отличить действительное число от мнимого для комплексного числа, я бы сделал одно из следующих действий.

  • Заключите число в некоторые скобки, чтобы убедиться, что оно рассматривается как единое целое. Например, 6 + 5i становится {6,5} или {6,5i} для дополнительной читаемости.
  • Введите маркер для разделения частей, аналогично показателю в 6.022e23. Например, 6 + 5i становится 6i5. Вам все еще нужны круглые скобки, чтобы указать формулы для этого, например, 6 + (b / 2), я становлюсь 6i (b / 2), а не запутывающий 6ib / 2 (который также можно прочитать как (6ib) / 2) и, к сожалению, вы теряете использование i в качестве переменной.

Любой из них будет легко обрабатывать даже с помощью простого синтаксического анализатора, и они достаточно близки к математической записи, чтобы не перепутать. Я предпочитаю первое, так как оно кажется мне более явным и использует символы, которые вряд ли запутают.

1 голос
/ 21 сентября 2009

Большинство языков, которые я могу найти, которые имеют встроенный тип комплексного числа (например, Python и Lisp), используют что-то вроде:

c{r, i}
1 голос
/ 21 сентября 2009

У ваших пользователей есть особые обозначения, которые они используют? Не могли бы вы выбрать один из них как можно ближе к их? В моем случае я бы использовал + bi, поэтому я бы сказал {31 * 5} + {6 + -5} i, однако, если они привыкли к функциональной форме, то я предлагаю сложный (31 * 5, 6 + -5 ).

Поскольку вы используете .net, возможно, вы захотите использовать DLR для синтаксиса python или ruby ​​?

0 голосов
/ 21 сентября 2009

Кажется, вы используете явное умножение в своих примерах (т.е. вам требуется A * B, а не A B).

В таком случае, почему бы просто не использовать суффикс i сразу после значения, как в

 myComplex = 12 + 6i
   or
 myOtherComplex = 12/7 + (6 * pi)i

Тогда вам, возможно, придется определиться с i или j, я видел оба ...

Этот трюк с i-суффиксом мало чем отличается от научного уведомления и является e (например, 3.1415e7)

Редактировать (после комментариев Дэвида)

Приведенный выше формат может сбивать с толку, в зависимости от аудитории, один из способов прояснить это может состоять в том, чтобы разрешать только мнимые литералы и включать их в a комплексная запись, полученная из существующей векторной записи . Когда мнимые числа или комплексные числа требуют выражения для их обозначения, синтаксис потребует явного явного «функционального» синтаксиса , такого как Воображаемый (i) и Комплексный (r, i).

Правила синтаксического анализа :

  • Любое число (со знаком или без знака, целое или десятичное число или даже порядковый номер записи), за которым непосредственно следует суффикс i, является воображаемым числом: -7i или 1.23i или 5.76e4i, но не 12 i (между цифрами не должно быть пробелов и суффикс)
  • вектор двух значений с первым действительным и вторым мнимым комплексом: (1, 7i) или даже (7, 0i)
  • Воображаемый (i) формат используется, когда значение «i» является выражением. i выражается без суффикса i, что подразумевается синтаксисом вызова метода.
  • Сложный (r, i) формат используется, когда параметры «r» или «i» являются / являются выражением, а также всякий раз, когда мы хотим избежать двусмысленности.

Короче :

  • (7, 1i), (0, -3.1415i), (13, 0i), Complex (13, 0) или Complex (7x + 3, sin (y) +2) - все это комплексные числа
  • 6i, -1.234e5i, мнимое (1.234) или мнимое (sqrt (19x + 5y)) - все мнимые числа
  • (12, 23, 34) - вектор в R ^ 3
  • (12i, -2i) в векторе в I ^ 2 (не комплексное число, поскольку первый элемент не веществен)
  • ((0,0i), (1, -9,2i), (12, 0i)) или ((0, 21i), Complex (12,3), (44, -55i)) являются векторами в C ^ 3

Это кажется непротиворечивым и достаточно простым, но опять же, только истинные конечные пользователи могут сказать.

...