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