Neslib.MultipRecision добавляет два дополнительных типа с плавающей точкой для использования с Delphi. Они предлагают точность, которая в 4 раза больше, чем у Double типа.
Neslib.multiprecision строится на вершине QD 2.3.22 и работает над:
Алгоритмы, используемые для этих типов, были разработаны Дэвидом Х. Бейли, Йозо Хидой и Сяай С. Ли. Посмотрите файл QD.PDF в подкаталоге C, если вы заинтересованы в деталях.
Для установки:
> git clone https://github.com/neslib/Neslib.MultiPrecisionЭта библиотека не имеет зависимости от других библиотек. Также нет зависимостей времени выполнения. Базовая библиотека C/C ++ QD связана с исполняемым файлом с использованием объектных файлов или статических библиотек.
Эта библиотека определяет два дополнительных типа с плавающей точкой:
DoubleDouble : Это 128-битный тип, который в два раза превышает точность Double типа.QuadDouble : это 256-битный тип, который в четыре раза превышает точность Double типа. Оба типа имеют одинаковый диапазон, что и двойной тип (около ± 10 308 ), но гораздо более высокая точность. По сравнению с Single и Double :
| Тип | Экспонент Биты | Мантисса Биты | Точность (Десятичные цифры) |
|---|---|---|---|
| Одинокий | 9 | 24 | 7 |
| Двойной | 12 | 53 | 16 |
| Doubledouble | 12 | 106 | 32 |
| QuadDouble | 12 | 212 | 64 |
Названия
DoubleDoubleиQuadDoubleпроисходят из базовой библиотеки QD. Вместо этого я считал название этихFloat128иFloat256, но уже есть официальные спецификации IEEE для таких (аппаратных) типов. А поскольку они не совместимы сDoubleDoubleиQuadDouble, я не хотел добавлять путаницу.
Базовая библиотека QD не использует эмуляцию для расчетов. Вместо этого он использует существующие возможности с плавающей точкой процессора для использования 2 или 4 Double значений для повышения точности. В результате эти типы намного быстрее, чем другие произвольные/высокие математические библиотеки с использованием той же точности. Кроме того, в отличие от многих других библиотек, эти типы не требуют динамического распределения памяти, что еще больше помогает производительности, а также снижает фрагментацию памяти.
Типы DoubleDouble и QuadDouble могут использоваться почти так же, как Double тип. Они поддерживают обычных операторов ( + , - , * , / , = , <> , < , <= , > и >= ), а также большинство методов, доступных для рекордов для Double типа ( IsNan , IsInfinity , IsNegativeInfinity , IsPositiveInfinity , ToString , Parse и TryParse ). Существуют методы и операторы, которые для преобразования в Double , DoubleDouble , QuadDouble и String .
Поскольку язык Delphi не позволяет вам вводить в исходные литералы с плавающей запятой в исходном коде, значение DoubleDouble или QuadDouble переменной должно быть инициализировано каким-либо другим способом. Существуют различные варианты (при условии, что DD имеет тип DoubleDouble здесь):
Init . Например, DD.Init(1.23); Инициализировать DoubleDouble из Double .DD := DoubleDouble(1.23); ПолемDD := DoubleDouble.Pi; ПолемDD := '3.1415926535897932384626433832795'; ПолемЯ не добавил неявных операторов, таких как
DD := 1.23;, поскольку они могут привести к непреднамеренным преобразованию, которые влияют на производительность.
Важно, чтобы вы назвали MultiPrecisionInit , прежде чем выполнять какие -либо расчеты DoubleDouble / QuadDouble . Это готовит FPU/CPU для высокой математики. Вы можете использовать MultiPrecisionReset для восстановления FPU/CPU до его предыдущего состояния.
Конфигурация библиотеки по умолчанию подходит для большинства приложений. Эта конфигурация жертвует немного точности для повышения скорости. Если точность важнее скорости для ваших целей, то вы можете составить библиотеку с определением MP_ACCURATE . Это сделает много расчетов немного медленнее, но более точным.
Основная библиотека QD (и, следовательно, эта библиотека) поддерживает множество общих математических функций. Кроме того, библиотека Neslib.MultipRecision добавляет многочисленные эквиваленты функций, обнаруженных в системе. Систем и System.Math.
| Имя | Описание |
|---|---|
| Strtodoubledouble, strtoquaddouble, Strtodoubledef, strtoquaddoublef, Tristrtofloat | Преобразовать из строки |
| FloattoStr, floattoStrf | Преобразовать в строку |
| Обратный | Рассчитать взаимный |
| Рем | Рассчитать остаток, округление до ближайшего |
| Делить | Рассчитайте результат деления, включая остаток |
| FMOD | Рассчитать остаток, округлый в сторону нуля |
| SQRT, SQR | Квадратный корень и квадратный |
| Тунк, пол, ceil, раунд | Различные методы округления |
| АБС | Абсолютное значение |
| Мин, макс | Вернуть минимальное или максимальное значение |
| Inrange, antureurange | Сравните с диапазоном |
| Самую помощь | Приблизительная проверка равенства |
| Power, IntPower, NROOT, LDEXP, Exp | Экспоненциальные функции |
| Ln, lnxp1, log2, log10, logn | Логарифмические функции |
| Грех, cos, sincos, tan | Тригонометрические функции |
| Arcsin, Arccos, Arctan, Arctan2 | Обратные тригонометрические функции |
| Sinh, Cosh, Sincosh, Tanh | Гиперболические функции |
| Arcsinh, Arccosh, Arctanh | Обратные гиперболические функции |
| Котан, кроватка, Secant, Sec, CoseCant, CSC | Взаимные тригонометрические функции |
| Coth, Sech, CSCH | Взаимные гиперболические функции |
| Arccot, Arcsec, Arccsc | Взаимные обратные тригонометрические функции |
| Arccoth, Arcsech, Arccsch | Взаимные обратные гиперболические функции |
| Radtodeg, Radtograd, Radtocycle | Преобразовать из радиан |
| Degtorad, Degtograd, Degtocycle | Преобразовать из градусов |
| Gradtorad, Gradtodeg, Gradtocycle | Преобразовать из выпускников |
| Cycletorad, Cycletodeg, Cysterograd | Преобразовать из циклов |
Забавный способ продемонстрировать высокую математику-это расчет фрактала Мандельброта. Когда вы увеличиваете масштаб в фрактале, вам нужно все больше и больше. Подкаканинация образцов содержит приложение FireMonkey, которое генерирует фрактал Мандельброта на 4 уровнях точности ( Single , Double , DoubleDouble и QuadDouble ).
Следующее изображение показывает крошечную часть фрактала с использованием увеличения одного квадриллиона (10 15 , он же один бильярд в Европе) и Double точность:

Вы можете четко видеть, что Double тип не обеспечивает достаточной точности на этом уровне увеличения. Тип DoubleDouble предлагает более чем достаточную точность:

Только после того, как вы достигнете уровня увеличения 10 31 , вам нужно переключиться на QuadDouble .
В Neslib.multiprecision есть нечто большее, чем описано выше. Для получения более подробной информации вы можете посмотреть на хорошо документированный Neslib.MultiPrecision.pas исходный файл. Дополнительные образцы использования могут быть найдены в подкаталоге Unittests и применении образца Мандельброта.
Если вы заинтересованы в технических деталях и алгоритмах, используемых для этих типов, вы можете взглянуть на файл QD.PDF в подкаталоге C.
Как было сказано, эта библиотека построена на вершине библиотеки QD. Это библиотека C/C ++, которая связана с вашим исполняемым файлом Delphi с использованием объектных файлов или статических библиотек. Если вам когда -нибудь понадобится или вы хотите создать эти объектные файлы и статические библиотеки самостоятельно, посмотрите на файл readme.txt в подкаталоге C для инструкций.
Neslib.multiprecision лицензирован по упрощенной лицензии BSD. См. License.txt для деталей.
Базовая библиотека QD лицензирована по лицензии BSD-LBNL. См. Документ bsd-lbnl-license.doc в подкатарии C для деталей.