MathParse

Точки входа
Действия:
doCalc Вызывает процесс синтаксического разбора формулы и вычисления результата
doMathStr Устанавливает строку для математического разбора методами doCalc и reCalc
doClear Сбрасывает состояние ошибки: св-во PosErr принимает значение –1, а Result принимает значение Default
События:
onResult Происходит после успешного вычисления методом doCalc (в случае неуспеха - onError) и выдает результат в поток
onError Происходит при ошибке по методу doCalc. В поток выдается целое число: 0 – соответствует синтаксической ошибке, а 1 – ошибке вычислений. Если точка не подключена, сообщение об ошибке выдается в окно Debug
Свойства:
Result Хранит результаты предыдущего вычисления. Если была ошибка – возвращает NULL
reCalc Метод, альтернативный doCalc. Данные из потока снизу выполняют ту же функцию, что и данные входного потока в методе doCalc. Однако события onResult или onError не происходят, а результат возвращается обратно в вызвавший поток. Если произошла ошибка, возвращается NULL
PosErr Номер позиции в строке (начинается с нуля) при возникновении ошибки при использовании методов doCalc и reCalc. Если последний вызов этих методов окончился успешно, хранит –1
Данные:
X<число> А это и есть аргументы формулы. Используются в формуле как %<число>. Если точка не подключена, данные для нее (если, конечно, эта переменная используется в формуле) возьмутся из входного потока. Ну а если не подключены две точки, участвующие в вычислительной формуле, будет ошибка!
Значения параметров
DataCount Кол-во аргументов (нумеруются от %1 до %DataCount, %0 - значение результата)
MathStr Вычислительная формула, установленная с самого начала, до применения метода doMathStr
ResultType Тип результата. Может быть Real (по умолчанию) и Integer
Default Значение результата, которое можно прочитать методом Result (или как %0 в формуле) в самом начале, или после метода doClear
AngleMode Режим работы тригонометрических функций. Угловые данные могут восприниматься/возвращаться либо в радианах (по умолчанию) либо в градусах

Дополнительная информация и рекомендации

     Элемент поддерживает использование внешних функций, обращение к элементам массивов, матриц, к функциональным блокам.

     Пример: %1+2*sh(%2(3)) - первый аргумент делает вызов с точки X1, отправляя наверх данные типа NULL (т.е. ничего); второй же аргумент отправляет наверх данные (3.0) типа real и получает результат работы функционального блока, подключенного к этой точке (а он уже и используется в вычислениях). Таким функциональным блоком может быть такой же MathParse со своей формулой и подключенный к точке reCalc, либо целая схема на HiAsm. Синтаксис использования массивов и матриц аналогичен, но использует квадратные скобки: %5[2] – второй элемент массива, подключенного к точке 5; %1[%2*4, %3+1] – соответствующий элемент матрицы, подключенной к точке 1. Понятно, что в качестве аргументов функционального вызова могут стоять поноценные выражения.

     Поддержана возможность итеративных вычислений без внешнего элемента Memory. Можно в формуле обратиться к результату предыдущих вычислений (%0) и сбросить значение результата (перед началом операций) методом doClear в значение, определяемое свойством Default.

     Возможно проведение нового вычисления по запросу на нижнюю точку reCalc. При этом данные, поступившие снизу выполняют роль данных из потока при запуске вычислений методом doCalc. В общем MathParse-ы можно вертикально каскадировать, причем верхний MathParse будет вызываться нижним сколько раз, сколько потребуется в формуле.

     При ошибках в вычислении, кроме ее типа (Синтаксис, Вычисления), доступна позиция в исходной строке, на которой анализатор элемента отказался продолжать. Это можно прочитать с нижней точки PosErr. Следует отметить, что при наличии ошибки, событие onResult не генерируется, но onError - обязательно. После ошибки - с нижней точки Result читается NULL, а при отсутствии ошибки в предыдущем вычислении - с нижней точки PosErr читается -1 (несуществующая позиция в строке). Метод doClear сбрасывает состояние ошибки. Метод doCalc (как и reCalc) после ошибки автоматически делает doClear.

     Внимание! Порядок вызова верхних точек отличается от общепринятого (слева направо). Теперь он определяется только только формулой MathStr. При этом, если какой-то аргумент вызывался один раз, и он не является функциональным, то вызов производится только один раз. Это же касается и данных из потока, которые используются в качестве первого же аргумента, у которого верхняя точка свободна. Ну а функциональные вызовы (как и вызовы матриц и массивов) осуществляются столько раз, сколько встречаются в формуле. Поскольку это могут быть, например, элементы массива от разных значений индекса. Пример, демонстрирующий порядок вызова аргументов: Хотим посчитать биномальный коэффициент N!/K!/(N-K)! Для этого, например, подключаем к точке X1 - значение N, к точке X2 - значение K, а к точке X3 - функциональный блок, вычисляющий факториал. Записываем формулу: %3(%1)/%3(%2)/%3(%1-%2) При вычислении, обращения будут происходить в следующей последовательности (читайте строку слева направо): [точка X1] => [точка X3 с соответствующим аргументом] => [точка X2] => [точка X3 с соответствующим аргументом] => [точка X3 с нужным аргументом, значения с X1 и X2 уже известны].

MathParser имеет следующие встроенные математические функции:

Имя в маске описание ф-ции
x + y сложение
x - y вычитание
x * y умножение
x / y деление
x ^ y возведение в степень
x div y целочисленое деление(извлечение целой части)
x mod y остаток от деления
cos(x) косинус угла в радианах
sin(x) синус угла в радианах
tg(x) тангес угла в радианах
ctg(x) котангес угла в радианах
arccos(x) арккосинус
arcsin(x) арксинус
ln(x) натуральный логарифм числа
sqrt(x) квадратный корень числа
atan(y,x) угол, определяемый точкой с координатами (x,y)
ch(x) гиперболический косинус (exp(x)+exp(-x))/2
sh(x) гиперболический синус (exp(x)-exp(-x))/2
th(x) гиперболический тангенс sh(x)/ch(x)
cth(x) гиперболический котангенс ch(x)/sh(x)
arcch(x) обратная ch(x)
arcsh(x) обратная sh(x)
arcth(x) обратная th(x)
arccth(x) обратная cth(x)
log(n,x) логорифм от x по основанию: n ln(x)/ln(n)
lg(x) десятичный логорифм ln(x)/ln(10)
exp(x) экспонента: e^x
sqr(x) просто квадрат: x*x
abs(x) абсолютная величина числа
sign(x) знак числа, принимает соответственно значения -1,0,+1
round(x[,y=1]) округление, round(x,y)=y*round(x/y)
frac(x[,y=1]) дробная часть, frac(x,y)=y*frac(x/y)
trunc(x[,y]) отбрасывание дробной, trunc(x,y)=y*trunc(x/y)
min(x[,y,...]) находим минимум от всех аргументов
max(x[,y,...]) находим максимум от всех аргументов
pi возвращает число ПИ = 3.141592653589793...
e возвращает число e = 2.1718281828459045...

  Примеры: Draw