Files
owniverse/world/owniverse/math/README.md
T
Kirill c4e7302567 Add new tests and implement frame budget management
- Introduced `civilization_benchmark.gd` and `legacy_quantity_math.gd` for benchmarking and legacy quantity calculations.
- Created `test_dynamic_math.gd`, `test_frame_evolution.gd`, and `test_sparse_batches.gd` to validate mathematical operations and frame evolution logic.
- Implemented `frame_budget.gd` to manage cooperative work on the main thread, ensuring no partially calculated state is published.
- Added UID files for all new scripts to maintain unique identifiers.
2026-10-01 23:43:34 +03:00

4.1 KiB
Raw Blame History

Числа симуляции

Целые значения в диапазоне int64 хранятся как int. Остальные числа имеют вид polarity × (sum(whole[i] × 10^(9i)) + fraction): whole — динамический массив целых блоков по основанию 10^9, fraction — float от 0 включительно до 1 исключительно. Числа после создания не изменяются. Ограничения E27 в хранении нет; размер массива растёт по необходимости.

Используйте API E.add/subtract/multiply/divide, E.eq/lt/le/gt/ge и E.floor_value/ceil_value/round_value. Обычные операторы над ExactValue не работают. E.integer требует значения в диапазоне int64; E.approx явно преобразует число в float и для очень больших чисел возвращает бесконечность. Сравнение через E сохраняет отличие конечного большого числа от INF.

Целые операции выполняются точно. Умножение и деление используют безопасные разряды из big_integer.gd; нативная арифметика применяется при отсутствии переполнения int64. E.mul_div(count, numerator, denominator) сохраняет точное целое частное, не превращая заранее отношение в приближённый коэффициент. E.floor_sum суммирует округлённые линейные квоты без перебора каждого окна.

Дробный остаток приблизительный: при умножении и делении он преобразуется в десятичную дробь с 16 значащими цифрами. При сложении двух ненулевых остатков перенос около целой границы стабилизируется с допуском 10^-12. Умножение большого количества на float усиливает ошибку коэффициента; для известных точных отношений используйте mul_div. Целые распределения и сохранение числа объектов проверяются строго, без допуска.

Возраст сохраняет точную целую часть. Только дробная часть переводится в наносекундные тики, дополнительный остаток времени переносится между кадрами. Синхронный диагностический API evolute отклоняет шаги от 1e27 игровых лет: это защита от непрактичного интервала, а не предел хранимого возраста. Покадровый API ограничивает одну транзакцию обычным шагом 1/60 секунды; остальное запрошенное время остаётся в очереди.

Формат сохранения — 5, версия состояния — 0.3.0. Большие целые и числа с дробью кодируются как {"$exact": [[blocks], "float bytes in hex", sign]}. Байты остатка сохраняются без потери точности JSON. Миграции старых форматов нет.

Проверки: test_exact_math.gd, test_dynamic_math.gd, test_quantity_catalog.gd, test_time.gd и test_frame_evolution.gd. Независимый целочисленный эталон покрывает числа до 220 десятичных цифр; отдельные проверки — до E1000, границы int64, доли, сериализацию, распределения и продолжение расчёта.