Двойная точность координат
Бывают случаи, когда нужно рассчитывать очень большие числа (например, расстояния в пространстве) или, наоборот, очень маленькие числа (например, расстояния в микромире). В связи с этим Unigine предлагает 64-битный формат с плавающей запятой двойной точности (вместо 32-битного формата одинарной точности) для определения координат объектов в виртуальной сцене. Следовательно, можно создавать высокодетализированные виртуально неограниченные миры (максимальные значения координат фактически в 536 870 912 раз больше, чем для 32-битной точности с плавающей запятой).
На самом деле ограничения одинарной точности заметны даже на сценах размером более 10x10 км из-за накопления ошибок позиционирования, поэтому для сохранения точности следует использовать двойную точность для всего, что больше.
Одинарная точность против двойной точности#
В вычислениях формат с плавающей запятой представляет собой метод представления действительного числа с помощью мантиссы и экспоненты:
mantissa × base ^ exponent ,
где base равно 2 .
Стандарт IEEE для арифметики с плавающей запятой (IEEE 754) - это технический стандарт, используемый как для форматов с плавающей запятой, так и для форматов с плавающей запятой двойной точности. Формат с плавающей запятой одинарной точности занимает 32 бита (4 байта), формат с плавающей запятой двойной точности занимает 64 бита (8 байтов). Числовые форматы для обоих случаев можно увидеть на картинке ниже:
Где:
- S - знак ( 0 - положительный; 1 - отрицательный)
- E - показатель степени ( 127 для одинарного, 1023 для двойного)
- m - мантисса [1;2]
Распределение для формата с плавающей запятой (как одинарного, так и двойного) субнормальное. Например, у нас есть -1 ≤ E ≤ 2:
Возможный диапазон значений для одинарной и двойной точности, а также минимально возможные градации показаны на рисунке ниже.
- Диапазон значений: [-10^9;+10^9]. Меньшие и большие значения будут отображаться как inf (бесконечность).
- Максимальное количество чисел в дробной части не может быть больше 3.
Значения, устанавливаемые с помощью функций API, имеют только ограничения формата.
Ошибки#
Использование формата с плавающей запятой одинарной точности приводит к ошибкам в расчетах, показанных ниже.
Ошибка позиционирования#
Большое расстояние между возможными градуировками в числах с плавающей запятой одинарной точности приводит к ошибкам позиционирования . На рисунке ниже схематично показано позиционирование с использованием одинарной и двойной точности:
В виртуальной сцене преобразования объектов (включая перемещение, вращение и масштабирование), анимация и реализация физики приводят к ошибке позиционирования, которая, в свою очередь, вызывает дрожание объектов. Чтобы избежать этой проблемы и обеспечить более точное позиционирование, используйте координаты с плавающей запятой двойной точности. Кроме того, ошибки позиционирования могут привести к коллапсу вершин, что схематично видно на рисунке ниже.
Накопление ошибок#
Поскольку числа в формате IEEE 754 представляют собой конечный набор, в который передается бесконечный набор действительных чисел, выходное значение может содержать ошибку точности представления, которая в дальнейших вычислениях вызывает накопление ошибок . Функция ошибки показана ниже:
Максимальная абсолютная ошибка числа равна половине возможной градации. Поскольку возможная градация удваивается при увеличении экспоненты, увеличивается и ошибка.
Градация чисел равна 2 ^ (E-150) для чисел с одинарной точностью и 2 ^ (E-1075) для чисел с двойной точностью.
Давайте сравним значение 1 для чисел с одинарной и двойной точностью.
Одинарная | Двойная | |
---|---|---|
Число, дес. | 1.0 | 1.0 |
IEEE754, шестн. | 3F800000 | 3FF00000 00000000 |
Абсолютная погрешность, дес. | 2 -23 ≈ 1,192 * 10 -7 | 2 -52 ≈ 2.220446 * 10 -16 |
Относительная погрешность, % | 11.9209 * 10 -6 | 2.220446 * 10 -14 |
По распределению значения градаций увеличиваются, что приводит к увеличению погрешности. Но для сравнения, ошибка чисел двойной точности во много раз меньше ошибок чисел одинарной точности.