This page has been translated automatically.
Видеоуроки
Interface
Essentials
Advanced
Подсказки и советы
Программирование на C#
Рендеринг
Принципы работы
Свойства (properties)
Компонентная Система
Рендер
Физика
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Настройки и предпочтения
Работа с проектами
Настройка параметров узла
Setting Up Materials
Setting Up Properties
Освещение
Landscape Tool
Sandworm
Использование инструментов редактора для конкретных задач
Extending Editor Functionality
Встроенные объекты
Nodes
Objects
Effects
Decals
Light Sources
Geodetics
World Objects
Sound Objects
Pathfinding Objects
Players
Программирование
Основы
Настройка среды разработки
Примеры использования
UnigineScript
C++
C#
Унифицированный язык шейдеров UUSL
File Formats
Rebuilding the Engine Tools
GUI
Двойная точность координат
API
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
Работа с контентом
Оптимизация контента
Материалы
Art Samples
Tutorials
Внимание! Эта версия документация УСТАРЕЛА, поскольку относится к более ранней версии SDK! Пожалуйста, переключитесь на самую актуальную документацию для последней версии SDK.
Внимание! Эта версия документации описывает устаревшую версию SDK, которая больше не поддерживается! Пожалуйста, обновитесь до последней версии SDK.

Двойная точность координат

Бывают случаи, когда нужно рассчитывать очень большие числа (например, расстояния в пространстве) или, наоборот, очень маленькие числа (например, расстояния в микромире). В связи с этим 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:

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

Примечание
Значения, устанавливаемые в UnigineEditor, имеют следующие ограничения:
  • Диапазон значений: [-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

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

Последнее обновление: 09.04.2021
Build: ()