Вещественные типы

Обзор вещественных типов в Delphi
В экосистеме Delphi работа с числами с плавающей точкой реализована через несколько специализированных типов, каждый из которых имеет строго определённые характеристики. В отличие от целочисленных или строковых типов, вещественные переменные требуют понимания компромиссов между точностью, диапазоном и производительностью. Ниже приведены технические спецификации, особенности изготовления (компиляции) и критерии качества выбора того или иного типа.
Основные типы: Double, Single, Extended
- Single (32 бита) — соответствует IEEE 754 одинарной точности. Занимает 4 байта, диапазон от 1.5×10⁻⁴⁵ до 3.4×10³⁸, точность около 7–8 десятичных цифр. Эффективен при массовой обработке в графике или аудио, где критична скорость заполнения памяти.
- Double (64 бита) — двойная точность (IEEE 754). 8 байт, диапазон до 1.7×10³⁰⁸, точность 15–16 знаков. Стандарт де-факто для финансовых расчётов и научных задач в Delphi. Рекомендуемый тип по умолчанию.
- Extended (80 бит) — расширенная точность. Изначально аппаратно поддерживался сопроцессором x87 (10 байт). Диапазон до 1.1×10⁴⁹³², точность до 19–20 десятичных цифр. Внимание: на платформе Win64 и Linux компилятор Delphi автоматически преобразует Extended в Double из-за отсутствия прямой поддержки в SSE/AVX. Для точных расчётов на современных ARM-системах этот тип не рекомендован.
Специализированные форматы: Currency и Decimal
- Currency — фиксированная точка (4 десятичных знака после запятой, 8 байт). Оптимизирован для бухгалтерских операций: исключает ошибки округления, характерные для двоичных дробей. Однако работает медленнее Double при умножении/делении.
- Decimal (Delphi 10.4+ / 2026) — 128-битный десятичный тип. Полностью избегает проблем с двоичным представлением (0.1 + 0.2 ≠ 0.3). Реализован через TBCD в старых версиях, в новых — через record с перегрузкой операторов. Используется в ERP-системах и кассовых операциях при расчёте НДС.
Отличия от альтернатив (C#, Python, C++)
- Extended (80 бит) — уникальная особенность Delphi (наследие архитектуры x87). В C++ доступен только через нестандартные расширения компилятора; Java и C# не поддерживают его вовсе. Для проектов на Delphi, мигрирующих на .NET, потеря Extended может вызвать расхождения в расчётах.
- Currency — отсутствует аналог в стандартной библиотеке Python; в C# есть decimal, но с большим диапазоном (28 знаков) и другой производительностью.
- Decimal в Delphi — в отличие от decimal в C#, не является встроенным типом CLR, а реализован через класс или запись. Это накладывает накладные расходы при создании экземпляров, но даёт полный контроль над округлением (банковское округление).
Качество и стандарты производства (компиляции)
Компилятор Delphi (версии 12+ и 2026) для вещественных типов применяет следующие гарантии:
- Соответствие стандарту IEEE 754 для Single и Double при включённой опции
$OPTIMIZATION ON(FPU исключения контролируются через SetExceptionMask). - Для Win32 Extended поддерживается на уровне инструкций FILD/FSTP; на Win64/Linux эмулируется через библиотеку SoftFloat, что снижает скорость на 20–30% по сравнению с Double.
- Режим округления по умолчанию — «банковский» (round to even). Это стандарт качества для финансовых приложений: избегает накопления систематической ошибки +0.5.
- Для высокопроизводительных вычислений (графика, инженерия) — Single: экономит кэш и пропускную способность памяти.
- Для финансов и учёта — Currency (TBCD) или Decimal при большом количестве знаков. Double допускается только в индикативных расчётах.
- Для кросс-платформенных проектов (Windows + Linux + macOS) — Double, поскольку Extended повсеместно эмулируется или отсутствует.
- Для наследуемого кода — проверить, что компилятор не заменяет Extended на Double неявно: использовать директиву
{$EXCESSPRECISION OFF}для контроля.
Рекомендации по выбору (2026)
Выбор вещественного типа в Delphi — это баланс между физическими ограничениями аппаратуры и требованиями к точности. Понимание этих нюансов — залог стабильной работы приложения без сюрпризов округления.
Добавлено: 27.04.2026
