Вычислить значение функции
вам нужна функция оценщик двигатель для этого (это не так сложно кода) есть is нет оценить только если вы хотите поддержка +, - операции !!! Все мои функции оценщики работает следующим образом:
компилировать исходный текст функции
Сначала нужно создать функции, поддерживаемые таблицы (идентификатор, Num операндов, имя, указатель на функцию), как:
+,-,*,/,sin,cos,....
Это будут строительные блоки для любого поддерживаемого выражения, которое необходимо оценить. Не забудьте также закодировать все функции в вашем коде. Кронштейны для ключей (
, )
также как функции (push,pop
). Группируйте свои функции по количеству операндов, поэтому +,-
с 1 и 2 операндами (две разные функции каждый !!!).
Теперь из выражения экстракта:
- имена переменных
- постоянные имена и значения
- число значений
В какой-то таблицы/списка:
variables[](id,name,value)
constants[](id,name,value)
numbers [](id, ,value)
И теперь, наконец, t скомпилированная функциональная строка. Мои строки заданы из двух int
. Сначала type
(какая таблица использовать), а вторая - id
(указатель в таблице).
, например, выражение:
sign(sqrt(2)-1)
типов:
id type
0 function
1 number
2 constant
3 variable
функции:
id name pointer
0 '(' ???
1 ')' ???
2 '+' ???
3 '-' ???
4 '*' ???
5 '/' ???
6 'sqrt' ???
7 'sign' ???
Там нет переменных или константы.В номера являются:
id value
0 2
1 1
скомпилирован строка:
type id
0 7 // sign(1 operand)
0 6 // sqrt(1 operand)
1 0 // 2
0 3 // - (2 operands)
1 1 // 1
После компиляции вы должны интерпретировать строку и оценить его значение.
инициализации переменных
op1=0`,`op2=0, // set all operands to zero (number depends on supported functions usually 2)
opn=0 // actual operands number
fx=none // actual function (for example none=-1)
fxn=0 // actual function operands number
прочитал первую запись из скомпилированного строки
, если это значение (число, константа, переменная) устанавливается соответствующая op?
значение с ней и приращение счетчика операнда opn++
,
если функция установлена fx,fxn
код с его
если opn == fxn
Вы достигли требуется операнд COUNT так выполнять функцию fx
и инициализации следующей функции
op1=fxtab[fx].pointer(op1,op2,...)
fx=none,fxn=1
opn=1 (some spec functions can return more operands, then set op1,op2,.. opn=...)
если не конец строки goto # 2 но со следующей строкой запись
в конце op1
должны держать ваше выходное значение
некоторые примеры функции (реализация C++):
double sign(double op1)
{
if (op1>0.0) return +1.0;
if (op1<0.0) return -1.0;
return 0.0;
}
double sqrt1(double op1) { return sqrt(op1); }
double plus1(double op1) { return op1; }
double minus1(double op1) { return -op1; }
double plus2(double op1,double op2) { return op1+op2; }
double minus2(double op1,double op2) { return op1-op2; }
[Примечания]
Вы есть для обработки особых случаев, таких как function = "";
. Также будьте осторожны, чувствительность к регистру, потому что любая ошибка в компиляции делает недействительным результат.
Скорость не большая проблема, это интерпретация-оценка не численное решение. Все операции называются в то же время, что и на бумаге.
Вы также должны обрабатывать математические ошибки (переполнение, недействительные операнды NaN
, Inf
...)
Я обычно групповые функции с одинаковым числом операндов иметь тип, чтобы упростить вещи
Когда вы говорите " алгебраический ", содержит ли он неизвестные? – Eric
Нет, он свободен от переменных. Кроме того, когда я сказал «алгебраический», я не имел в виду, что он может содержать только альгероидные числа. Он также может содержать что-то вроде log (2) или atan (2). Но я не ищу общий алгоритм. –
Вы должны оценить выражение с достаточной точностью.Вероятно, вы захотите использовать арифметический пакет с произвольной точностью и, возможно, интервальную арифметику. –