c4e7302567
- 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.
44 lines
4.1 KiB
Markdown
44 lines
4.1 KiB
Markdown
# Числа симуляции
|
||
|
||
Целые значения в диапазоне 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, доли, сериализацию, распределения и продолжение расчёта.
|