Голосование

Какой почтовый клиент Вы используете?

Microsoft Outlook
Outlook Express
The Bat!
Thunderbird
Eudora
Opera
Веб-интерфейс
Другой



Посмотреть результаты
Другие опросы ...

 

Лента RSS, новости сайта Новости сайта
Лента RSS, новости форума Новости форума
  Bookmark and Share

Архив исходников

   
  Базы данных
  Графика & Мультимедиа
  Сети & Интернет
  Система
  Разное
   

Кнопки, Ссылки и Баннеры ...

 


Automatic translation


English German French Italian Spanish
Portuguese Greece Japan Chinese Korean


Ссылки и Баннеры


скрыть

 

Delphi Sources

Delphi Sources

СТАТЬИ

 

. : Расчет математических формул : .

 

Введение

Представляю вашему вниманию пакет компонентов для расчета математических формул.

Компоненты работают в Delphi 6, Delphi 7, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Delphi XE6, Delphi XE7, Delphi XE8.

В архиве содержится исходный код, а еще — примеры, которые не требуют установки компонентов. Просто открываете файл проекта и запускайте его.

Компоненты для расчета математических формул

Последние изменения

1. Улучшен алгоритм работы кэша.

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

Если требуется вычислить значение формулы, которая есть в кэше, то, соответственно, берется уже существующий байт-код и не тратится время впустую на повторное преобразование формулы.

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

В действительности кэш работает еще чуть сложнее. Есть второй уровень кэша, в который попадает структура формулы. Под структурой я подразумеваю некий шаблон выражения, в котором убраны все числа, вне зависимости от их типа. Например, для выражения 2 * 2 шаблон будет такой: ? * ?.

Как и в случае с кэшем первого уровня, в кэш второго уровня попадает не только сама формула, но и множество ее мелких фрагментов. Это также дает определенный прирост производительности при расчете сложных выражений.

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

Все процессы, описанные выше, можно отключить: Parser.Cached := False; В этом случае парсер будет переводить формулу в байт-код каждый раз, когда требуется вычислить ее значение.

Кэш используетновый хэшированный список, в прежних версиях использовался THashedStringList,недостатоккоторого в том, что в момент вызова унаследованного метода Changedхэш-таблица помечается как недействительная и в последующем вызове метода IndexOf или IndexOfName пересоздается. То есть, другими словами, любое изменение списка приводит к пересозданию хэш-таблицы. Переделанный списокназывается TFastList, он унаследован от TStringList. В случае необходимости можно использовать этот класс отдельно от парсера. Там пересоздание хэш-таблицы происходит только тогда, когда это действительно необходимо, например, в момент загрузки из файла. В других случаях, например, в случае изменения строки, хэш-таблица меняется соответственно с минимальными издержками.Как показал тест, в среднем,требуется 15 итераций на поиск строки в списке емкостью 100 тысяч строк.TFastList также поддерживает одновременную работу в нескольких потоках. Есть также специальный тест на производительность этого списка в архиве с исходным кодом.

2. Реализован, механизме расстановки приоритетов. Ранее расчет проводился по порядку – слева направо.

В новой версии каждая функция имеет приоритет:


TFunctionPriority = (fpLower, fpNormal, fpHigher);
TPriorityCoverage = (pcLocal, pcTotal);
TPriority = record
Priority: TFunctionPriority;
Coverage: TPriorityCoverage;
end;

Приоритет может быть пониженный (fpLower), нормальный (fpNormal) или повышенный (fpHigher). Также указывается область действия этого приоритета (TPriorityCoverage).

Если у функции приоритет пониженный, то она вычисляется последней. Если приоритет нормальный – расстановка приоритета не производится вообще. Если приоритет повышенный –функция вычисляется первой.

Область действия приоритета функции может быть двух типов – локальная и полная. Если область действия локальная, то расстановка приоритета затрагивает группу зависимых друг от друга функций. Полная область действия затрагивает все выражение.

Поясню на примере. В качестве тестового выражения возьмем «3 * 4 / 6 – 2 = 0». Допустим у функции «*» пониженный приоритет (fpLower), а область действия – локальная. Тогда парсер изменит выражение следующим образом: «3 * (4 / 6) – 2 = 0». Таким образом функция «*» в группе функций: «3 * 4 / 6», будет выполнена последней.

Теперь, если область действия полная, то выражения изменится так: «3 * (4 / 6 - 2 = 0)». В данном случае функция «*» будет выполнена последней в масштабах всего выражения.

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

  • = пониженный приоритет, область действия полная
  • <> пониженный приоритет, область действия полная
  • > пониженный приоритет, область действия полная
  • < пониженный приоритет, область действия полная
  • >= пониженный приоритет, область действия полная
  • <= пониженный приоритет, область действия полная
  • ^: повышенный приоритет, область действия локальная

Пример вышев действительности даст несколько другой результат, так как в нем используется функция «=» из списка.

Процесс расстановки приоритетов осуществляется в момент преобразования выражения в байт-код и практически не сказывается на его скорости. Та часть парсера где происходит расчет байт-кода не изменена, таким образом расстановка приоритетов функций не влияет на скорость расчета. А отключить механизм расстановки приоритетов можно установив свойство TCustomParser.Prioritize в False.

Краткий обзор

  • Компоненты предназначены для расчета математических и логических формул и работают быстро. Максимальная скорость расчета простейшего выражения более 10 миллионов вычислений в секунду. Сложные формулы вычисляются медленнее, например, для формулы типа X * 2 + Y * 2 скорость расчета составляет около 3 миллионов вычислений в секунду.
  • Существует два основных компонента — TParser и TCalculator. Оба рассчитывают выражения. Первый содержит много низкоуровневых методов и полезен, например, если вы собираетесь регистрировать новые функции или же каким-то иным образом расширять его функциональность. TCalculator агрегирует TParser и по своей сути проще в использовании, а также позволяет отойти от ненужного понимания внутренних механизмов работы компонентов.
  • Компоненты вычисляют массивы выражений. Быстро. Например, для расчета массива выражений можно использовать в цикле функцию AsInteger(constFromula: string): Integer.
  • Компоненты переводят формулу в байт-код в буквальном смысле этого слова — TScript = Types.TByteDynArray. Все вычисления производятся по байт-коду.
  • Числа, указанные в формуле, хранятся именно в том формате, которому они соответствует. Например, в формуле "2 * 2" тип обоих числа будет определен как Byte. И именно в формате Byte эти числа будут храниться и в формате Byte принимать участие в расчете. А если, например, вы напишете "(Integer 2) * 2.0", то типа первого числа будет определен как Integer, а второго — как Double.
  • Компоненты позволяют преобразовывать байт-код обратно в формулу.
  • Компоненты при необходимости упрощают байт-код. Например, формула "(2 + 2) * (Random 2 + 2 * 2)" в результате оптимизации (упрощения) станет "4 * (Random 2 + 4)". Оптимизация это процесс преобразования байт-кода (а не текстовой формулы), который проходит с высокой скоростью.
  • Компонент TParser содержит несколько наборов кэш-памяти. Процесс компиляции достаточно трудоемок и гораздо быстрее получить байт-код из какого-нибудь кэша. Например, один тип кэш-памяти запоминает выражения, которые были вычислены и если позже требуется вычислить такое же точно выражение, то байт-код берется из хранилища памяти. А другого типа кэш-память запоминает структуру байт-кода, в которой числа теряют значение. Если, например, вы вычисляете выражение "2 * 2", то кэш преобразовывает его в "? * ?", где вместо знака вопроса может быть любое число. Позже, например, если вы вычисляете выражение "3 * 3", то байт-код предоставляется хранилищем памяти.
  • Компонент TCalculator содержит еще один уровень кэш-памяти.
  • Компоненты легко использовать. Чтобы начать ими пользоваться, достаточно просто посмотреть несколько примеров.

Пример вычисления математического выражения:


var
Value: Double;
begin
Value := Calculator.AsDouble('2 * 2');

Пример вычисления логического выражения:


var
Value: Boolean;
begin
Value := Calculator.AsBoolean('2 * 2 = 4');

Создание переменной MyVar, ее инициализация и использование в математическом выражении:


var
Value: Double;
begin
Calculator.ItemValue['MyVar'] := '2 * 2';
Value := Calculator.AsDouble('MyVar + 1');

Использование многопоточного режима:


var
I: Integer;
begin
Calculator.Thread.AddText('2 * 2');
Calculator.Thread.AddText('2 * 3');
Calculator.Thread.AddText('2 * 4');
Calculator.Thread.AddText('2 * 5');
 
Calculator.Thread.Execute;
 
// When all threads are done, Calculator.OnDone fires
Calculator.Thread.WaitFor;
 
for I := 0 to Calculator.Thread.ItemCount - 1 do
begin
 
ShowMessage(ValueToText(Calculator.Thread.Item[I].Value));

В этой статье есть масса демонстрационных программ (кстати, чтобы их запустить не требуется что-либо устанавливать и прописывать какие-либо пути — достаточно просто открыть файл проекта — .dpr), которые полностью раскрывают основные возможности компонентов.

Некоторые возможности компонентов

  • Возможна компиляция выражения в байт-код и использование полученного байт-кода в дальнейших вычислениях;
  • Возможна декомпиляция байт-кода обратно в выражение;
  • Возможно создание и использование пользовательских функций. Пользовательские функции могут быть следующих типов:
  • Функция не требующая параметров. Такая функция просто возвращает некоторый результат;
  • Функция требующая в выражении параметр перед собой;
  • Функция требующая в выражении параметр после себя;
  • Функция требующая в выражении два параметра — перед собой и после себя;
  • Функция требующая в выражении несколько параметров после себя, расположенные в круглых скобках и разделенных друг от друга запятой.
  • Возможно создание и использование пользовательских переменных;
  • Возможно создание и использование переменных, представляющих собой прямые ссылки на переменные, объявленные в вашей программе;
  • Возможно создание и использование констант;
  • Возможно создание и использование пользовательских типов данных, представляющих собой псевдонимы существующих типов данных в TParser;
  • Возможна оптимизация выражений. Оптимизация упрощает математическое выражение (если это возможно) на уровне байт-кода; результат — уменьшение размера байт-кода и увеличение скорости расчета;
  • Возможно многопоточное вычисление выражений, которое в TCalculator автоматизировано за счет наличия механизма управления встроенными потоками. Многопоточные вычисления обеспечивает лучшую производительность за счет одновременного расчета нескольких массивов выражений:
  • Возможно использование встроенных автоматических потоков;
  • Возможно управление многопоточным расчетом, в т.ч. количеством автоматических потоков и их приоритетами;
  • Возможно использование компонентов в пользовательских потоках — наследниках Classes.TThread для одновременного расчета массива выражений;
  • Возможно определение нескольких пользовательских переменных с целью создания т.н. цепочки зависимостей (любой глубины), в которой каждая переменная зависит от предыдущей;
  • Возможно подключение пользовательских списков переменных в которых каждый элемент списка представлен в виде NAME=VALUE, где NAME это имя переменной, а VALUE — значение.

Условия распространения

Компоненты распространяются в виде исходного кода. Их коммерческое использование в обязательном порядке требует согласования с автором. Любое изменение, внесенное в представленные компоненты, с последующей публикацией также требует согласования с автором. В случае некоммерческого использоваться компонентов разрешение предоставляется при условии размещения ссылки на сайт http://www.mathparser.net на веб-сайте компании.

Описание

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

CalcUtils

Этот модуль содержит набор самых простых методов, работающих с высокой скоростью. Чтобы их использовать, достаточно просто подключить модуль.

Методы вычисляют выражение представленное в параметре "Text" и возвращают результат вычисления (например, AsByte ("2 * 2")):


function AsByte(const Text: string): Byte;
function AsShortint(const Text: string): Shortint;
function AsWord(const Text: string): Word;
function AsSmallint(const Text: string): Smallint;
function AsLongword(const Text: string): Longword;
function AsInteger(const Text: string): Integer;
function AsInt64(const Text: string): Int64;
function AsSingle(const Text: string): Single;
function AsDouble(const Text: string): Double;
function AsExtended(const Text: string): Extended;
function AsBoolean(const Text: string): Boolean;
function AsPointer(const Text: string): Pointer;
function AsString(const Text: string): string;

Следующая функция рассчитывает значения поля в компоненте типа TDataSet. Формула находится в поле, имя которого указано в параметре FormulaFieldName, функция помещает результаты вычисления в поле, имя которого указано в параметре OutputFieldName. Если вычисления выполнены без ошибок, функция возвращает истину, иначе — ложь:


function CalcDataSet(constDataSet: TDataSet;
constFormulaFieldName, OutputFieldName: string): Boolean;

TCalculator

TCalculator — это, грубо говоря, оболочка TParser, расширяющая его возможности (например, позволяет использовать автоматический многопоточный расчет), а также предоставляет разработчикам возможность отойти от использования низкоуровневых методов. По факту TCalculator агрегирует TParser и предоставляет возможность доступа к последнему.

Все вычисления выполняются двумя способами:

  • Компиляция выражения в байт-код и дальнейшее использование полученного байт-кода. Этот метод является самым быстрым и позволяет достичь максимальной скорости расчета — приблизительно 10 миллионов вычислений в секунду для самых простых формул. Для формулы типа X * 2 + Y * 2 скорость расчета составляет около 3 миллионов вычислений в секунду;
  • Непосредственный расчет текстового выражения. Означает передачу выражения без промежуточного этапа компиляции (компиляция тем не менее все равно неявно происходит) в метод каждый раз, когда требуется вычислить его значение. Этот способ медленнее, но, тем не менее, достаточно быстрый, благодаря наличию в TCalculator средств, предназначенных для повышения производительности.

TParser

TParser предназначен для расчета математических и логических выражений и содержит множество стандартных функций, так как, например, Sin (возвращает синус угла в радианах) или Sqrt (возвращает квадратный корень числа). Компонент также содержит стандартный набор типов, таких как Byte или Word, которые используются совместно с функциями, переменными, константами и числами. TParser позволяет создавать ваши собственные функции, переменные, константы и типы (AddFunction, AddVariable, AddConstant, AddType методы). Все вычисления компонент производит разбирая скрипт (байт-код) — бинарное представлении текстового выражения (формулы). То есть выражение необходимо вначале преобразовать в скрипт (StringToScript метод). Выражение не имеет ограничений по длине и количеству вложенных выражений (вложенное выражение это то, что находится в скобках в формуле). Скрипт представляет собой байт-код во всех смыслах этого слова — TScript = Types.TByteDynArray. Парсер оптимизирует выражение при необходимости (Optimize метод), а также поддерживает обратное преобразование скрипта в выражение (ScriptToString метод).

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

Операнды выполняют какое либо действие с выражением:

  • +: операнд, выполняет операцию сложения
  • : операнд, выполняет операцию вычитания

Функции выполняют вычисления и возвращают результат. Существует пять типов функций:

  • Функция не требующая параметров. Такая функция просто возвращает некоторый результат. Например, True функция (возвращает 1) не требует никаких параметров. Такая функция ведет себя как переменная;
  • Функция требующая в выражении параметр перед собой. Например, ! функция (возвращает факториал выражения) требует выражение перед собой;
  • Функция требующая в выражении параметр после себя. Например, Int функция (возвращает целую часть выражения) требует выражение после себя;
  • Функция требующая в выражении два параметра — перед собой и после себя. Например, ^ функция (возводит выражение в любую степень) требует оба параметра — перед собой и после себя;
  • Функция требующая в выражении несколько параметров после себя, расположенные в круглых скобках и разделенных друг от друга запятой. Например, Sum функция (возвращает сумму всех входящих параметров) требует один или более параметров.

Переменные содержат числа или ссылаются на числа в вашей программе. Константы содержат числа.Приведенный ниже список содержит описание стандартных функций, переменных и констант:

  • *: функция, выполняет умножение;
  • /: функция, выполняет деление;
  • Succ: функция, возвращает следующее значение параметра;
  • Pred: функция, возвращает предыдущее значение параметра;
  • not: функция, выполняет битовую операцию NOT (отрицание);
  • and: функция, выполняет логическое AND двух параметров;
  • or: функция, выполняет логическое OR двух параметров;
  • xor: функция, выполняет логическое XOR двух параметров;
  • shl: функция, выполняет битовую операцию сдвиг влево параметра;
  • shr: функция, выполняет битовую операцию сдвиг вправо параметра;
  • SameValue (A: Double; B:Double; Epsilon: Double = 0): функция, возвращает True если два параметра (приблизительно) равны. Epsilon это максимальная величина на которую параметры A и B могу различаться но при этом рассматриваться как одинаковые;
  • IsZero (A: Double; Epsilon: Double = 0): функция, возвращает True если параметр A (приблизительно) равен нулю или отличается от нуля не более чем на величину параметра Epsilon;
  • If (AValue: Boolean; ATrue: Expression; AFalse: Expression): функция, в случае, если AValue — истина, возвращает ATrue, в противном случае — возвращает AFalse. Особенность функции заключается в том что вычисляется только тот параметр, значение которого возвращается; то есть, если AValue — истина, то вычисляется только ATrue; если AValue — ложь, то вычисляется только AFalse;
  • IfThen (AValue: Boolean; ATrue: Expression; AFalse: Expression): функция, в случае, если AValue — истина, вычисляет ATrue, в противном случае возвращает AFalse. Особенность функции заключается в том что вычисляются оба параметра, значения которых могут быть возвращены; то есть, каким бы ни было значение AValue, вычисляются и ATrue и AFalse;
  • EnsureRange (AValue, AMin, AMax: Double): функция, возвращает ближайшее к AValue в диапазоне AMin — AMax;
  • StrToInt (S: string): функция, конвертирует строку с целым значением в целое Integer. Поддерживает шестнадцатеричные числа с префиксов $ или 0x;
  • StrToIntDef (S: string; Default: Integer): функция, конвертирует строку с целым значением в целое Integer. В случае если преобразование не удалось, возвращает Default. Поддерживает шестнадцатеричные числа с префиксов $ или 0x;
  • StrToFloat (S: string): функция, конвертирует числовую строку в значение с плавающей точкой. Поддерживает целый формат, формат с плавающей точкой и научный (экспоненциальный) формат;
  • StrToFloatDef (S: string; Default: Double): функция, конвертирует числовую строку в значение с плавающей точкой. В случае если преобразование не удалось, возвращает Default. Поддерживает целый формат, формат с плавающей точкой и научный (экспоненциальный) формат;
  • False: функция, возвращает 0;
  • True: функция, возвращает 1;
  • =: функция, возвращает True если параметры равны;
  • <>: функция, возвращает True если параметры не равны;
  • >: функция, возвращает True если первый параметр больше второго;
  • <: функция, возвращает True если первый параметр меньше второго;
  • >=: функция, возвращает True если параметры равны или если первый параметр больше второго;
  • <=: функция, возвращает True если параметры равны или если первый параметр мельше второго;
  • GetEpsilon: функция, возвращает число Epsilon, представляющее собой разницу на которую могут различаться числа и при этом рассматриваться как одинаковые. Epsilon используется многими функциями, такими как SameValue, IsZero и т.д.;
  • SetEpsilon (Value: Double): функция, устанавливает число Epsilon, представляющее собой разницу на которую могут различаться числа и при этом рассматриваться как одинаковые. Epsilon используется многими функциями, такими как SameValue, IsZero и т.д.;
  • SetDecimalSeparat (S: string): функция, устанавливает символ, который используется для разделения целой и дробной части числа;
  • div: функция, выполняет целочисленное деление;
  • mod: функция, возвращает остаток от деления двух чисел;
  • ^: функция, возводит выражение в любую степень;
  • !: функция, возвращает факториал выражения;
  • Sqrt: функция, возвращает квадратный корень выражения;
  • Int: функция, возвращает целую часть числа;
  • Round: функция, округляет вещественное число до ближайшего целого числа;
  • RoundTo (Value: Extended; Digit: Shortint): функция, округляет вещественное число до заданного количества разрядов или заданной степени;
  • Trunc: функция, возвращает целую часть вещественного числа;
  • Abs: функция, возвращает абсолютную величину числа;
  • Frac: функция, возвращает дробную часть вещественного числа;
  • Ln: функция, возвращает натуральный логарифм выражения;
  • Lg: функция, возвращает десятичный логарифм выражения;
  • Log: функция, возвращает логарифм по указанному основанию;
  • Exp: функция, возвращает экспоненту числа;
  • Random: функция, возвращает случайное число в диапазоне 0 <= Value< 1;
  • Sin: функция, возвращает синус угла в радианах;
  • ArcSin: функция, возвращает значение арксинуса числа в радианах;
  • Sinh: функция, возвращает гиперболический синус угла;
  • ArcSinh: функция, возвращает значение гиперболического арксинуса числа;
  • Cos: функция, возвращает косинус угла в радианах;
  • ArcCos: функция, возвращает значение арккосинуса числа в радианах;
  • Cosh: функция, возвращает гиперболический косинус угла;
  • ArcCosh: функция, возвращает значение гиперболического арккосинуса числа;
  • Tan: функция, возвращает тангенс угла в радианах;
  • ArcTan: функция, возвращает значение арктангенса числа в радианах;
  • Tanh: функция, возвращает гиперболический тангенс угла;
  • ArcTanh: функция, возвращает значение гиперболического арктангенса числа;
  • Cotan: функция, возвращает котангенс угла в радианах;
  • ArcCotan: функция, возвращает значение арккотангенса числа в радианах;
  • Cotanh: функция, возвращает гиперболический котангенс угла;
  • ArcCotanh: функция, возвращает значение гиперболического арккотангенса числа;
  • Sec: функция, возвращает секанс угла в радианах;
  • ArcSec: функция, возвращает значение арксеканса числа в радианах;
  • Sech: функция, возвращает гиперболический секанс угла;
  • ArcSech: функция, возвращает значение гиперболического арксеканса числа;
  • Csc: функция, возвращает косеканс угла в радианах;
  • ArcCsc: функция, возвращает значение арккосеканса числа в радианах;
  • Csch: функция, возвращает гиперболический косеканс угла;
  • ArcCsch: функция, возвращает значение гиперболического арккосеканса числа;
  • ArcTan2 (Y, X: Double): функция, вычисляет ArcTan(Y/X) и возвращает значение угла в радианах с учетом квадранта в диапазоне -Pi — Pi. Значения X и Y не должны выходить за пределы диапазона -2^64 — 2^64, а также значение Х не должно быть равным 0;
  • Hypot (X, Y: Double): функция, вычисляет длину гипотенузы прямоугольного треугольника с заданной длиной двух сторон x и y. Вызов Hypot эквивалентен следующему: Sqrt (X ^ 2 + Y ^ 2);
  • RadToDeg: функция, преобразует величину в радианах в градусы;
  • RadToGrad: функция, преобразует величину в радианах в десятичные градусы;
  • RadToCycle: функция, преобразует величину в радианах в циклы;
  • DegToRad: функция, преобразует величину в градусах в радианы;
  • DegToGrad: функция, преобразует величину в градусах в десятичные градусы;
  • DegToCycle: функция, преобразует величину в градусах в циклы;
  • GradToRad: функция, преобразует величину в десятичных градусах в радианы;
  • GradToDeg: функция, преобразует величину в десятичных градусах в градусы;
  • GradToCycle: функция, преобразует величину в десятичных градусах в циклы;
  • CycleToRad: функция, преобразует величину в циклах в радианы;
  • CycleToDeg: функция, преобразует величину в циклах в градусы;
  • CycleToGrad: функция, преобразует величину в циклах в десятичные градусы;
  • LnXP1: функция, возвращает натуральный логарифм ln(X+1);
  • Log10: функция, возвращает логарифм числа по основанию 10;
  • Log2: функция, возвращает логарифм числа по основанию 2;
  • IntPower (Base: Double; Exponent: Integer): функция, возводит Base в целочисленную степень;
  • Power (Base: Double; Exponent: Double): функция, возводит Base влюбуюстепень;
  • Ldexp (X: Double; P: Double): функция, возвращает X * (2 ^ P);
  • Ceil: функция, округляет вещественное число до наименьшего целого;
  • Floor: функция, округляет вещественное число до наибольшего целого;
  • Poly (X: Double; Coefficients(1)..Coefficients(N): Double): функция, возвращаетоднородныйполином;
  • Mean (Data(1)..Data(N): Double): функция, возвращает среднее число из всех значений массива;
  • Sum (Data(1)..Data(N): Double): функция, возвращает сумму всех значений массива;
  • SumInt (Data(1)..Data(N): Integer): функция, возвращает сумму всех значений целочисленного массива;
  • SumOfSquares (Data(1)..Data(N): Double): функция, возвращает сумму квадратов всех значений массива;
  • MinValue (Data(1)..Data(N): Double): функция, возвращает минимальное число из всех значений массива;
  • MaxValue (Data(1)..Data(N): Double): функция, возвращает максимальное число из всех значений массива;
  • MinIntValue (Data(1)..Data(N): Integer): функция, возвращает минимальное число из всех значений целочисленного массива;
  • MaxIntValue (Data(1)..Data(N): Integer): функция, возвращает максимальное число из всех значений целочисленного массива;
  • StdDev (Data(1)..Data(N): Double): функция, возвращает стандартное среднеквадратичное отклонение (квадратный корень типовой дисперсии) из всех значений массива;
  • PopnStdDev (Data(1)..Data(N): Double): функция, Функция вычисляет среднеквадратичное отклонение совокупности (квадратный корень дисперсии совокупности) из всех значений массива;
  • Variance (Data(1)..Data(N): Double): функция, возвращает выборочную дисперсию всех значений массива;
  • PopnVariance (Data(1)..Data(N): Double): функция, возвращает выборочную дисперсию всех значений массива;
  • TotalVariance (Data(1)..Data(N): Double): функция, возвращает полную дисперсию всех значений массива — сумму квадратов расстояний всех значений от их среднего арифметического;
  • Norm (Data(1)..Data(N): Double): функция, возвращает норму всех значений массива — квадратный корень из суммы квадратов всех значений;
  • RandG (Mean, StdDev: Double): функция, возвращает нормально распределенные случайные числа с заданным средним значением и среднеквадратическим отклонением;
  • RandomRange (AFrom, ATo: Integer): функция, генерирует произвольное целое число в диапазоне AFrom — ATo;
  • RandomFrom (Value(1)..Value(N): Double): функция, возвращает случайно выбранный элемент массива;
  • Pi: константа, возвращает 3.1415926535897932385;
  • Kilobyte: константа, возвращает 1024;
  • Megabyte: константа, возвращает 1048576;
  • Gigabyte: константа, возвращает 1073741824;
  • MinShortint: константа, возвращает -128;
  • MaxShortint: константа, возвращает 127;
  • MinByte: константа, возвращает 0;
  • MaxByte: константа, возвращает 255;
  • MinSmallint: константа, возвращает -32768;
  • MaxSmallint: константа, возвращает 32767;
  • MinWord: константа, возвращает 0;
  • MaxWord: константа, возвращает 65535;
  • MinInteger: константа, возвращает -2147483648;
  • MaxInteger: константа, возвращает 2147483647;
  • MinLongword: константа, возвращает 0;
  • MaxLongword: константа, возвращает 4294967295;
  • MinInt64: константа, возвращает -9223372036854775808;
  • MaxInt64: константа, возвращает 9223372036854775807;
  • MinSingle: константа, возвращает 1.4012984643248170709e-45;
  • MaxSingle: константа, возвращает 340282346638528859811704183484516925440.0;
  • MinDouble: константа, возвращает 4.9406564584124654418e-324;
  • MaxDouble: константа, возвращает 1.7976931348623157081e+308;
  • New (VariableName: string; Value: Double; Optimizable: Boolean = False): функция, возвращает True если переменная с именем VariableName успешно создана и ее значение установлено равным Value. Впоследствии переменную можно использовать в любых выражениях. Параметр Optimizable определяет возможность оптимизации переменной. В случае если параметр Optimizable равен True, переменная может быть потеряна в результате упрощения выражения — оптимизации. Параметр Optimizable может быть опущен, по умолчанию он равен False;
  • Delete (VariableName: string; RaiseError: Boolean = True): функция, возвращает True если переменная с именем VariableName успешно удалена. Функция вызывает исключение если переменная не найдена и параметр RaiseError равен True. Параметр RaiseError может быть опущен, по умолчанию он равен True;
  • Get (VariableName: string; RaiseError: Boolean = True): функция, возвращает значение переменной с именем VariableName. Функция вызывает исключение если переменная не найдена и параметр RaiseError равен True. Параметр RaiseError может быть опущен, по умолчанию он равен True;
  • Set (Name: string, Value: Double; RaiseError: Boolean = True): функция, возвращает True если переменная с именем Name найдена и ее значение установлено равным Value. Функция вызывает исключение если переменная не найдена и параметр RaiseError равен True. Параметр RaiseError может быть опущен, по умолчанию он равен True;
  • For (VariableName: string; VariableValue: Integer; LoopCondition: Boolean; LoopExpression: Expression): функция, возвращает сумму результатов выполнения выражения LoopExpression в цикле. Например: For ("A", 1, Get("A") < 10, Set("A", Get("A") + 1)). Если переменная с именем VariableName не существует, она автоматически создается и существует в течение всего времени работы цикла;
  • Repeat (LoopExpression: Expression; LoopCondition: Boolean): функция, возвращает сумму результатов выполнения выражения LoopExpression в цикле. Например: Repeat (Set("A", Get("A") + 1), Get("A") > 10). Переменная с именем VariableName должна быть определена заранее;
  • While (LoopCondition: Boolean; LoopExpression: Expression): функция, возвращает сумму результатов выполнения выражения LoopExpression в цикле. Например: While (Get("A") < 10, Set("A", Get("A") + 1)). Переменная с именем VariableName должна быть определена заранее;
  • Script (Expression (1)..Expression (N): Expression): функция, возвращает сумму результатов выполнения выражений Expression. Например: Script (2 * 2, 3 * 3). Количество выражений неограниченно.

30.06.2015 - Исправлена ошибка, которая появляется когда в кэш добавляется отрицательное значение. Ошибка может быть причиной неправильного результата при вычислении выражения.
13.11.2015 - Добавлена поддержка Delphi 10.

Исходный код и оригинал статьи: math-parser.zip (1,7 Мб).

Дата: 30.06.2015, Автор: Pisarev.






Назад

   

 































































































































































































 

© 2004-2017 "DS"

Отправить письмо / Реклама


ВКонтакте   Facebook   Twitter