Комментарии к файлу

:: Delphi - Модули

verylongmath.zip  (22245 байт)
Посмотреть содержимое

TStas : 2006-01-28 11:13:09

Delphi - Модули

Модуль VeryLongMath.
В этом модуле определен тип: VeryLongInt - целые знаковые числа и математика для них. Это числа по модулю 100. Состоят из модуля, в котором задом наперед записаны разряды и знака (True - знак есть, т. е. число меньше нуля). Если числа не инициализированы, то ошибки не возникает, они автоматически инициализируются при обращении к функциям и им присваивается 0.

Оптимизация скорости выполнения: при переводе в строку длинна строки расчитывается сразу и устанавливается один раз. При переводе строки в число части строки только копируются. При умножении длинна результата также устанавливается один раз. Возведение в степень производится с минимальным числом умножений, см. код функции. Так, например при возведении в степень 100 будет произведено не 100, а только 8 операций умножения. Есть функция извлечения корня, которая возвращает точный ли он, а если неточный, то ближайшее целое.

TProgressEvent - процедурный тип, с помощью которого можно отображать процесс извлечения корня или вычисления НОК и НОД, а также остановить процесс. Умеет считать НОК и НОД для двух длинных чисел. При ошибках (деление на 0, корень из отрицательного числа) возбуждаются исключения.

Второй модуль - NumericParser. Использует VeryLongMath.
В этом модуле определен класс парсера. Парсер принимает строку и, возможно, процедуру TErrorEvent, с помощью которой он может указать место ошибки, если таковая возникла. Чтобы он парсил, нужно вызвать метод Parse. Понимает переменные, если создать TStrings и в свойства Objects записать длинные числа в виде TNumericObj, и записать полученный TStrings в свойство VarList. Понимает выражения двух типов - длинные числа или логичекие. Есть свойство ResultType, в котором записано, получилось ли парсить, а если - да, то каков тип выражения. Есть свойство Corrected, в котором записано, корректна ли выражение. Парсер понимает комментарии, которые находятся внутри фигурных скобок. Регистронезависим. Понимает функции Abs, Sqr, Sqrt, GCD (НОК), lcm (НОД), логические константы true и false. На основе парсера есть функция Eval, которая принимает строку и возвращает результат ее выполнения в виде строки.

Имеется тестовый проект в виде калькулятора.

Скачать

1085 скачиваний


Даниил гость #1 | 2012-08-30 01:54:20 

Классно!


Ilya гость (til__@mail.ru) #2 | 2017-05-02 00:07:32 

Например хочу извлечь корень из 1104601 и калькулятор виснет. Зацикливается на втором Repeat Until. Там где-то ошибка.


Heinrich (til__@mail.ru) #3 | 2017-05-02 00:33:20 

В общем, после первого Repeat Until записал следующее. Result.sign:=FALSE; Зацикливание при 1104601 исчезло и посчитал верно, но потом при числе 48650625 уже зацикливание в первом Repeat Until.

Добавить сообщение
Текст сообщения:
* Незарегистрированные пользователи не могут постить ссылки
Имя: E-mail: