Maxima Manual: Арифметические операторы

Next: Операторы отношения, Previous: Префиксные операторы (prefix), Up: Операторы [Contents][Index]

### 5.5 Арифметические операторы

Оператор: +
Оператор: -
Оператор: *
Оператор: /
Оператор: ^

  Символы `+`, `*`, `/` и `^` обозначают суммирование, умножение, деление и возведение в степень, соответственно. Имена этих операторов `"+"`, `"*"`, `"/"` и `"^"` могут появляться там, где требуется имя функции или оператора.

  Символы `+` и `-` представляют унарное суммирование и вычитание, соответственно, и имена этих операторов: `"+"` и `"-"`, соответственно.

  Вычитание `a - b` представляется в Maxima как суммирование `a + (- b)`. Выражения, такие как `a + (- b)`, отображаются как вычитание. Maxima распознает `"-"` только как имя унарного оператора вычитания, а не как имя бинарного оператора вычитания.

  Деление `a / b` представляется в Maxima как умножение, `a * b^(- 1)`. Выражения, такие как `a * b^(- 1)`, отображаются как деление. Maxima распознает `"/"` как имя оператора деления.

  Суммирование и умножение - n-арные (n-ary), коммутативные операторы. Деление и возведение в степень - бинарные, некоммутативные операторы.

  Maxima сортирует операнды коммутативных операторов для конструирования канонического представления. Во внутреннем хранилище упорядочивание управляется с помощью `orderlessp`. Для отображения, упорядочивание при суммировании управляется с помощью `ordergreatp`, а для умножения, флаг тот же, что и для внутреннего упорядочивания.

  Арифметические вычисления выполняются для буквальных чисел (целых, рациональных, обыкновенных чисел с плавающей точкой и чисел с плавающей точкой повышенной точности (bigfloat)). За исключением возведения в степень, все арифметические операции для чисел упрощаются до чисел. Возведение в степень упрощается до числа, в случае если, либо операнд является обыкновенным числом с плавающей точкой или числом с плавающей точкой повышенной точности (bigfloat), или если результат есть точное целое или рациональное число; иначе возведение в степень может быть упрощено до `sqrt` или другого возведения в степень, или оставлено неизменным.

  В арифметических вычислениях имеет место приведение типов значений результата: если любой операнд есть bigfloat, то результат будет bigfloat; или же, если любой операнд есть обыкновенное число с плавающей точкой, результат будет обыкновенным числом с плавающей точкой; или же, если операнды являются рациональными или целыми значениями, то результат будет рациональным или целым.

  Арифметические вычисления являются упрощением, а не в вычислением. Таким образом, арифметические операции выполняется в экранированных (но упрощенных) выражениях.

  Арифметические операции применяются элемент-за-элементом к спискам, когда глобальный флаг `listarith` есть `true`, и всегда применяется элемент-за-элементом к матрицам. Когда один операнд есть список или матрица и другой есть операнд некоторого другого типа, то другой операнд объединяется с каждым из элементом списка или матрицы.

  Примеры:

  Суммирование и умножение являются n-арными (n-ary) коммутативными операторами. Maxima сортирует операнды для того, чтобы сконструировать каноническое представление. Имена этих операторов `"+"` и `"*"`.

      (%i1) c + g + d + a + b + e + f;
      (%o1)               g + f + e + d + c + b + a
      (%i2) [op (%), args (%)];
      (%o2)              [+, [g, f, e, d, c, b, a]]
      (%i3) c * g * d * a * b * e * f;
      (%o3)                     a b c d e f g
      (%i4) [op (%), args (%)];
      (%o4)              [*, [a, b, c, d, e, f, g]]
      (%i5) apply ("+", [a, 8, x, 2, 9, x, x, a]);
      (%o5)                    3 x + 2 a + 19
      (%i6) apply ("*", [a, 8, x, 2, 9, x, x, a]);
                                       2  3
      (%o6)                       144 a  x

  Деление и возведение в степень - бинарные, некоммутативные операторы. Имена этих операторов `"/"` и `"^"`.

      (%i1) [a / b, a ^ b];
                                    a   b
      (%o1)                        [-, a ]
                                    b
      (%i2) [map (op, %), map (args, %)];
      (%o2)              [[/, ^], [[a, b], [a, b]]]
      (%i3) [apply ("/", [a, b]), apply ("^", [a, b])];
                                    a   b
      (%o3)                        [-, a ]
                                    b

  Вычитание и деление внутренне представляются в терминах суммирования и умножения, соответственно.

      (%i1) [inpart (a - b, 0), inpart (a - b, 1), inpart (a - b, 2)];
      (%o1)                      [+, a, - b]
      (%i2) [inpart (a / b, 0), inpart (a / b, 1), inpart (a / b, 2)];
                                         1
      (%o2)                       [*, a, -]
                                         b

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

      (%i1) 17 + b - (1/2)*29 + 11^(2/4);
                                             5
      (%o1)                   b + sqrt(11) + -
                                             2
      (%i2) [17 + 29, 17 + 29.0, 17 + 29b0];
      (%o2)                   [46, 46.0, 4.6b1]

  Арифметические вычисления являются упрощением, а не вычислением.

      (%i1) simp : false;
      (%o1)                         false
      (%i2) '(17 + 29*11/7 - 5^3);
                                    29 11    3
      (%o2)                    17 + ----- - 5
                                      7
      (%i3) simp : true;
      (%o3)                         true
      (%i4) '(17 + 29*11/7 - 5^3);
                                      437
      (%o4)                         - ---
                                       7

  Арифметические операции выполняется элемент-за-элементом для списков (в зависимости от значения `listarith`) и матриц.

      (%i1) matrix ([a, x], [h, u]) - matrix ([1, 2], [3, 4]);
                              [ a - 1  x - 2 ]
      (%o1)                   [              ]
                              [ h - 3  u - 4 ]
      (%i2) 5 * matrix ([a, x], [h, u]);
                                [ 5 a  5 x ]
      (%o2)                     [          ]
                                [ 5 h  5 u ]
      (%i3) listarith : false;
      (%o3)                         false
      (%i4) [a, c, m, t] / [1, 7, 2, 9];
                                [a, c, m, t]
      (%o4)                     ------------
                                [1, 7, 2, 9]
      (%i5) [a, c, m, t] ^ x;
                                            x
      (%o5)                     [a, c, m, t]
      (%i6) listarith : true;
      (%o6)                         true
      (%i7) [a, c, m, t] / [1, 7, 2, 9];
                                    c  m  t
      (%o7)                     [a, -, -, -]
                                    7  2  9
      (%i8) [a, c, m, t] ^ x;
                                x   x   x   x
      (%o8)                   [a , c , m , t ]

Оператор: **

  Оператор возведения в степень. Maxima распознает `**` как тот же оператор, что и `^` при вводе, и он отображается как `^` в 1D (одномерном) выводе, или в виде показателя степени как верхний индекс в 2D (двумерном) выводе.

  Функция `fortran` выводит оператор возведения в степень как `**`, не в зависимости от того, как он был задан при вводе, как `**` или `^`.

  Примеры:

      (%i1) is (a**b = a^b);
      (%o1)                         true
      (%i2) x**y + x^z;
                                    z    y
      (%o2)                        x  + x
      (%i3) string (x**y + x^z);
      (%o3)                        x^z+x^y
      (%i4) fortran (x**y + x^z);
            x**z+x**y
      (%o4)                         done

Next: Операторы отношения, Previous: Префиксные операторы (prefix), Up: Операторы [Contents][Index]