Ну. Обычно, для интерпретации формулы удобно компилировать в обратную (меньше ресурсов требует) польскую запись. Или в прямую, которая фактически является программой для стековой машины.
чесно говоря польская нотация удобна для интерпретации, а не для компиляции формул, тк реализация в рантайме дерева жрет слишком много ресурсов для >6^10 операций вычисления ...
Библиотеки можно поискать в составе bc - это калькулятор такой gnu'шный.
Но с другой стороны, вообще не понятна постановка задачи. Фрактал же не по формуле строится, а по штуке, которая называется итерационная система функций - iterated function system. Да и то не по любой, нужно условие наличия неподвижной точки и всё такое прочее. Так что, в общем-то, эмс... задача не очень ясна с наскока.
теории фракталов не нашел, тч не знаю что такое ifs, мой код строит фрактал рекурсивно:
из координат линии по 6-8 формулам получаем координаты еще 2х линий, и каждая из полученных линий вызывает функцию породившую ее пока не закончится счетчик итераций\рекурсий
зы одной неподвижной точки для построения фрактала имхо не хватит ...
Mayor1, Чем список отличается от дерева?
ну вообщето список линейная структура без ветвлений, и как оказалось при дальнейшем разборе формулы вида (3+4)*5-(1+2)*6 на базе списка не построить, так что я заменил дерево списком со стеком функций
элементы формулы компилятся вот в такую структуру:
typedef void(*pff)(void *, double *vars);
typedef struct {
pff func;
union {
double constant;
int indifier;
GSList *plist;
};
} token,*ptoken ;
что полностью исключает проверку условий на этапе расчета формулы и соответвенно делает невозможным обход дерева, но тк структура сложной формулы представляет собой дерево, то его эмуляция выполнена за счет рекурсии
pff функцией для доступа к аргументам формулы и сохранения промежуточных результатов используется:
typedef struct {
union {
double v_arg;
int n_arg;
};
double value;
double reserved;
...
} calc,*pcalc;
где ... означают любое число аргументов скомпилированной функции
в плане скорости выполнения 6^10 вызовов скомпиленных функций достоверных отличий от fpc скомпиленных формул не заметил
названия моей нотации еще не придумал ... но практического толку от нее мало - очень сложно переписывать в нее формулы :
dx x1 y1 x2 y2 = x2 + x1 - 1.6 /
dy x1 y1 x2 y2 = y2 + y1 - 1.6 /
fractal
# x3 = x1 + (x2-x1)/1.6
x3 x1 y1 x2 y2 = x1 + dx +
# y3 = y1 + (y2-y1)/1.6
y3 x1 y1 x2 y2 = y1 + dy +
x4 x1 y1 x2 y2 = x3 + dy +
y4 x1 y1 x2 y2 = y3 + dx -
x5 x1 y1 x2 y2 = x3 + dy -
y5 x1 y1 x2 y2 = y3 + dx +
#begin
к сожалению не осталось времени на создания интерпретатора из польской и инфиксной в мою нотацию
в плане реализации рантайм компилятора остались нерешенные проблеммы:
1. нада создать структуру с элеметом функцией аргумент которой указатель на эту структуру -- из за этого указатель в функции пришлось заменить на войд, как следствие из-за явного преобразования указателей время отладки увеличилось на 7 часов
2. нада сделать возможным ссылаться на часть функции
* x3 x1 y1 x2 y2 = x2 + x1 - 1.6 / =dx x1 + dx +
для упрощения написания интерпретатора польской нотации
3. нада дописать сборщик мусора
4. нада добавить тригонометрические функции
в плане тестирования использовался готовый генератор фракталов на паскале, что усложнило отладку и реализацию компилятора, а также сделало невозможным сравнить скорость вычсления формул скопиленных фпс и моим кодом
зы подскажите какую нить кросплатформенную библиотеку с доступом к графическому акселератору, клавиатуре, элементам управления\виджетам, мышке ... к которой есть интерфейсы у несколько языков программирования
http://pages.plotinka.ru/~mayor/fractal.tar.bz2 - исходники
Finch: Подправил линки в цитатах. Цитаты скорее всего взяты с другого форума, но ведут на наш форум, в тему совсем не связанную с данной