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

44 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Числа симуляции
Целые значения в диапазоне 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, доли, сериализацию, распределения и продолжение расчёта.