mORMot2 DailyЕжедневный обзор коммитов апстрима

Десятичный parser получил точное IEEE-округление после регрессии нуля

Этот выпуск продолжает стабилизацию числовых преобразований и исправляет заметные в production ошибки в обоих направлениях. DoubleToAscii теперь корректно обрабатывает научную нотацию и округление sticky bit на 64-bit, а GetExtended принимает граничные exponent и округляет обычные десятичные дроби до ближайшего IEEE double. GetNumericVariantFromJson также восстанавливает числовую обработку 0.0, поэтому backend, обменивающимся JSON numbers или сохраняющим floating-point значения как текст, следует взять всю серию.

Коротко

  • Переходите на commit c9eff241 в build 2.4.16851: он включает финальный merge десятичного округления после последнего увеличения номера версии.
  • GetNumericVariantFromJson снова разбирает 0.0 и дробные формы из одних нулей как числовой ноль вместо отказа числового преобразования.
  • GetExtended и GetNumericVariantFromJson теперь возвращают ближайший IEEE double для обычных дробей вроде 1.2, а не значение на один ULP выше.
  • DoubleToAscii исправляет пунктуацию научной нотации и применяет округление sticky bit на CPU64, улучшая точное преобразование floating-point значений в текст и обратно.
  • Путь GetExtended вне WIN32DELPHI теперь обрабатывает границы минимального subnormal и максимального конечного double без преждевременной ошибки.

Рекомендации по обновлению

Берите финальную revision c9eff241, обозначенную как build 2.4.16851, а не просто более ранний commit с тем же номером build. Избегайте builds 2.4.16844–2.4.16850: там GetNumericVariantFromJson может отвергать 0.0, а работа над границами вывода и parser ещё не завершена. После обновления повторите тесты JSON numbers, научной нотации и точного round trip double на каждой поставляемой цели Delphi и FPC.

Сборка2.4.16844 → 2.4.16851
Коммиты9
Строки+295 -77
Чтение3 мин

8 из 8 записей · 9 коммитов в апстриме

Сюжеты
# Запись Категория Модули
1 Высокий Обычные десятичные дроби округляются до ближайшего IEEE double GetExtended в mormot.core.text и GetNumericVariantFromJson в mormot.core.variants используют fast path Clinger для дробного exponent от -1 до -22, когда накопленное целое не превышает MAX_SAFE_JS_INTEGER. Они делят на точно представленную положительную степень десяти вместо умножения на неточную отрицательную степень; точные bit-тесты покрывают 1.2, 0.1, 2.675 и малые JSON double. Исправления mormot.core.text+1 aa165fe9+87-10

core: correctly rounded GetExtended() and GetNumericVariantFromJson() decimals

Влияние

Double, полученные из обычного десятичного текста, могут измениться на один ULP до правильно округлённого значения; например, на затронутом пути Pascal число 1.2 больше не становится 1.2000000000000002. Вызовы GetExtended на FPC и Delphi вне Win32 получают исправление напрямую, а GetNumericVariantFromJson исправлен на backend Delphi и FPC.

Публичный API

  • GetExtendedbehaviour-changed — Обычные десятичные дроби на пути Pascal теперь дают ближайший IEEE double.
  • GetNumericVariantFromJsonbehaviour-changed — Подходящие дроби JSON теперь дают ближайший IEEE double вместо ошибки округления на один ULP.

Dimitris Kounalakis · 22:54 UTC · открыть коммит на GitHub →

2 Высокий Форматирование CPU64 сохраняет sticky digit для корректного округления DoubleToAscii в mormot.core.text теперь добавляет синтетический ненулевой sticky digit на CPU64 так же, как на CPU32, когда за требуемой точностью остаются отброшенные bits. d2a_k_comp также заменяет floating-point вычисление логарифма на inline fixed-point целочисленную оценку, а экспоненциальный вывод ставит точку при наличии сохранённых дробных цифр. Исправления mormot.core.text f4433cf3+13-24

core: fixed DoubleToAscii()

Влияние

Сборки Delphi 64-bit и FPC 64-bit могут выдавать другие последние цифры для значений около границы равного округления: теперь отброшенный хвост учитывается при round-to-nearest-even. Сериализованные floating-point строки надёжнее разбираются обратно без потерь; signatures не меняются.

Публичный API

  • DoubleToAsciibehaviour-changed — Округление CPU64 теперь учитывает отброшенные ненулевые bits через sticky digit.

Модули

Arnaud Bouchez · 08:58 UTC · открыть коммит на GitHub →

3 Высокий Крайние десятичные exponent достигают допустимых границ double Реализация GetExtended вне WIN32DELPHI в mormot.core.text больше не отвергает все значения frac не выше -324. Для достижимого диапазона от -342 до -324 она предварительно масштабирует d64 перед оставшейся отрицательной степенью и пропускает frac 308 через существующий защищённый от overflow путь масштабирования. Исправления mormot.core.text 56bb70cd+14-4

core: fixed GetExtended() on huge/tiny exponents

Влияние

Backend на FPC и Delphi вне Win32 теперь могут разбирать допустимые десятичные значения на границах минимального subnormal и максимального конечного числа вместо ошибки или преждевременной потери. Этот commit не меняет x87 assembly реализацию Delphi Win32.

Стоит взглянуть

Повторно проверьте принимаемые и отклоняемые границы exponent, если валидация ввода зависит от err, возвращаемого GetExtended.

Публичный API

  • GetExtendedbehaviour-changed — Путь Pascal принимает допустимые крайние exponent double, которые раньше отклонялись преждевременно.

Модули

Arnaud Bouchez · 08:58 UTC · открыть коммит на GitHub →

4 Высокий Дробный ноль JSON снова обрабатывается как число GetNumericVariantFromJson в mormot.core.variants больше не завершает разбор при встрече разделителя после одного или нескольких дробных нулей. Функция отличает отсутствие первой цифры после точки от завершённой дробной части из нулей, а новые тесты требуют, чтобы 0.0 и 0.000000000 возвращали ноль varInteger. Исправления mormot.core.variants 58178149+8-3

core: fixed regression in GetNumericVariantFromJson()

Влияние

Числовой ноль JSON с точкой больше не приводит к отказу быстрого числового parser и не переходит к нечисловому представлению в высокоуровневых путях преобразования. Сервисы Delphi и FPC, получающие 0.0, снова получают тот же нормализованный целочисленный ноль, что и для других записей нуля.

Публичный API

  • GetNumericVariantFromJsonbehaviour-changed — JSON-формы с дробной частью из нулей снова успешно разбираются и нормализуются в ноль varInteger.

Arnaud · 21:34 UTC · открыть коммит на GitHub →

5 Средний Нулевые значения с exponent идут по безопасному fast path до масштабирования Путь Pascal GetExtended в mormot.core.text при v64 = 0 возвращает signed zero через общий финальный блок знака до масштабирования exponent. Вычисление малых exponent также перегруппировано: d64, множитель 1E-160 и оставшаяся обратная степень перемножаются в одном выражении. Исправления mormot.core.text 8b5a85a4+19-7

core: refine some GetExtended() specific cases

Влияние

Backend на FPC и Delphi вне Win32 принимают 0E400 и 0E-400 без range error и сохраняют отрицательный ноль. Изменения исходного кода не нужны; Delphi Win32 продолжает использовать отдельный assembly parser.

Публичный API

  • GetExtendedbehaviour-changed — Ноль остаётся допустимым при очень большом exponent, его знак сохраняется.

Модули

Arnaud Bouchez · 09:13 UTC · открыть коммит на GitHub →

6 Средний Научный формат больше не ставит десятичную точку не на место В mormot.core.text функция d2a_return_exponential теперь решает, выводить ли десятичную точку, после ограничения n_digits_have значением n_digits_req. Разделитель выводится вместе с дробными значащими цифрами, а не до определения их итогового количества. Исправления mormot.core.text 37212dc4+8-8

core: fixed DoubleToAscii() correctness of scientific notation

Влияние

Существующий код Delphi и FPC сохраняет ту же signature DoubleToAscii, но строки научной нотации в крайних случаях могут измениться и получить корректную пунктуацию. Consumers, сравнивающим сериализованный floating-point текст побайтно, следует обновить ожидаемые значения после всей серии.

Стоит взглянуть

Повторите golden-output тесты, точно сравнивающие научную нотацию DoubleToAscii.

Публичный API

  • DoubleToAsciibehaviour-changed — Научный вывод ставит десятичную точку только при наличии дробных значащих цифр.

Модули

Arnaud Bouchez · 07:40 UTC · открыть коммит на GitHub →

7 Низкий Round-trip покрытие расширено на знаки, масштабы и точные bit patterns test.core.base добавляет положительные и отрицательные случаи DoubleToShort от 1.5E-19 до 2E19, точные vectors QWord-to-double и проверки GetExtended для нуля с очень большими положительными и отрицательными exponent. Также проверяется вход TimeSpan с конечным пробелом. Тесты a155bf80+34-3

tests: enhanced double / text conversion coverage

Влияние

Изменений прикладного кода и публичного API нет. Расширенный набор закрепляет round trips formatter/parser на Delphi и FPC и показывает, что точные граничные проверки GetExtended не применяются к WIN32DELPHI.

Arnaud Bouchez · 09:00 UTC · открыть коммит на GitHub →

8 Низкий Тесты преобразования получили точные граничные vectors test.core.base добавляет проверки точных bits для минимального subnormal, максимального конечного и других граничных double, а также положительные и отрицательные round trips научной нотации. Локальный helper вывода теперь напрямую сравнивает значения ShortString. Тесты 511fe932+25-8

tests: enhanced floating point conversion vectors

Влияние

Изменений прикладного кода и публичного API нет. Тесты делают последующие граничные исправления parser и formatter наблюдаемыми на Delphi и FPC, а точные проверки bits GetExtended по-прежнему исключены для WIN32DELPHI.

Arnaud Bouchez · 07:41 UTC · открыть коммит на GitHub →

Активность апстрима коммитов в день · последние 60 дней
Коммиты977
Активных дней44/60
Пик активности2026-09-30
Максимум60
2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 26 commits2026-08-28: 11 commits2026-08-29: 10 commits2026-08-30: 1 commit2026-08-31: 23 commits2026-09-01: 0 commits2026-09-02: 20 commits2026-09-03: 29 commits2026-09-04: 35 commits2026-09-05: 13 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 23 commits2026-09-09: 10 commits2026-09-10: 17 commits2026-09-11: 23 commits2026-09-12: 14 commits2026-09-13: 9 commits2026-09-14: 7 commits2026-09-15: 4 commits2026-09-16: 24 commits2026-09-17: 26 commits2026-09-18: 21 commits2026-09-19: 59 commits2026-09-20: 13 commits2026-09-21: 5 commits2026-09-22: 34 commits2026-09-23: 17 commits2026-09-24: 57 commits2026-09-25: 22 commits2026-09-26: 26 commits2026-09-27: 0 commits2026-09-28: 2 commits2026-09-29: 19 commits2026-09-30: 60 commits2026-10-01: 26 commits2026-10-02: 30 commits2026-10-03: 32 commits2026-10-04: 15 commits2026-10-05: 1 commit2026-10-06: 26 commits2026-10-07: 37 commits2026-10-08: 27 commits2026-10-09: 35 commits2026-10-10: 33 commits2026-10-11: 9 commits2026-10-12: 11 commits2026-10-13: 35 commits
2026-08-152026-10-13