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]