Требует действийможет затронуть работающую системуВ исходном payload нет отметок superseded_by. Однако встроенные последовательные diffs показывают явное исправление регрессии GetNumericVariantFromJson и несколько накопительных исправлений преобразований. Commit aa165fe9 и его merge не увеличивают mormot.commit-num.inc выше 16851, поэтому важен полный landing SHA.
Десятичный 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.
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.
Рекомендуется обновиться
Возьмите merged head c9eff241 и повторите точные числовые сравнения, hashes или тесты сохранённых значений, зависящие от bits разобранного double.
Публичный API
GetExtendedbehaviour-changed — Обычные десятичные дроби на пути Pascal теперь дают ближайший IEEE double.GetNumericVariantFromJsonbehaviour-changed — Подходящие дроби JSON теперь дают ближайший IEEE double вместо ошибки округления на один ULP.
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 не меняются.
Рекомендуется обновиться
Обновитесь до финальной revision c9eff241 и повторите точные round trips floating-point сериализации на CPU64.
Публичный API
DoubleToAsciibehaviour-changed — Округление CPU64 теперь учитывает отброшенные ненулевые bits через sticky digit.
Модули
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, которые раньше отклонялись преждевременно.
Модули
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, снова получают тот же нормализованный целочисленный ноль, что и для других записей нуля.
Рекомендуется обновиться
Перейдите дальше builds 2.4.16844–2.4.16850 и проверьте поля JSON, где возможны 0.0 или ноль с последующими дробными цифрами.
Публичный API
GetNumericVariantFromJsonbehaviour-changed — JSON-формы с дробной частью из нулей снова успешно разбираются и нормализуются в ноль varInteger.
Модули
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, его знак сохраняется.
Модули
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 — Научный вывод ставит десятичную точку только при наличии дробных значащих цифр.
Модули
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.
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.