mORMot2 DailyLecture quotidienne des commits upstream

Le parsing décimal atteint l’arrondi IEEE exact après une régression sur zéro

Cette édition poursuit la stabilisation des conversions numériques avec des corrections de précision visibles en production dans les deux sens. DoubleToAscii gère maintenant correctement la notation scientifique et l’arrondi du sticky bit sur 64 bits, tandis que GetExtended accepte les exposants limites et arrondit les fractions décimales courantes vers le double IEEE le plus proche. GetNumericVariantFromJson rétablit aussi le traitement numérique de 0.0 ; les backends qui échangent des nombres JSON ou persistent des flottants en texte doivent donc prendre la série complète.

En bref

  • Passez au commit c9eff241 de la build 2.4.16851 ; il inclut le merge final sur l’arrondi décimal après la dernière incrémentation de version.
  • GetNumericVariantFromJson analyse de nouveau 0.0 et les formes fractionnaires entièrement nulles comme un zéro numérique au lieu d’échouer la conversion.
  • GetExtended et GetNumericVariantFromJson renvoient maintenant le double IEEE le plus proche pour des fractions courantes comme 1.2, au lieu d’une valeur supérieure d’un ULP.
  • DoubleToAscii corrige la ponctuation de la notation scientifique et applique l’arrondi sticky bit sur CPU64, améliorant les allers-retours exacts entre flottants et texte.
  • Le chemin GetExtended hors WIN32DELPHI traite maintenant les limites du plus petit subnormal et du plus grand double fini sans échec prématuré.

Conseil de mise à jour

Prenez la révision finale c9eff241 identifiée comme build 2.4.16851, pas seulement un commit antérieur portant ce numéro de build. Évitez les builds 2.4.16844 à 2.4.16850, où GetNumericVariantFromJson peut rejeter 0.0 et où le travail sur les limites de sortie et de parsing reste incomplet. Après mise à niveau, rejouez les tests de nombres JSON, de notation scientifique et d’aller-retour exact des doubles sur chaque cible Delphi et FPC livrée.

Build2.4.16844 → 2.4.16851
Commits9
Lignes+295 -77
Lecture4 min

8 sur 8 entrées · 9 commits upstream

Sujets
# Entrée Catégorie Unités
1 Élevée Les fractions décimales courantes s’arrondissent au double IEEE le plus proche GetExtended dans mormot.core.text et GetNumericVariantFromJson dans mormot.core.variants utilisent le fast path de Clinger lorsque l’exposant fractionnaire va de -1 à -22 et que l’entier accumulé reste dans MAX_SAFE_JS_INTEGER. Ils divisent par une puissance de dix positive représentée exactement au lieu de multiplier par une puissance négative inexacte ; des tests bit à bit couvrent notamment 1.2, 0.1, 2.675 et de petits doubles JSON. Correctifs mormot.core.text+1 aa165fe9+87-10

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

Impact

Les doubles issus de textes décimaux courants peuvent changer d’un ULP vers la valeur correctement arrondie ; par exemple, 1.2 ne devient plus 1.2000000000000002 sur le chemin Pascal concerné. Les appelants GetExtended sous FPC et Delphi hors Win32 en bénéficient directement, tandis que GetNumericVariantFromJson est corrigé sur les backends Delphi et FPC.

API publique

  • GetExtendedbehaviour-changed — Les fractions décimales courantes produisent maintenant le double IEEE le plus proche sur le chemin Pascal.
  • GetNumericVariantFromJsonbehaviour-changed — Les fractions JSON éligibles produisent maintenant le double IEEE le plus proche plutôt qu’une erreur d’arrondi d’un ULP.

Dimitris Kounalakis · 22:54 UTC · voir le commit sur GitHub →

2 Élevée Le formatage CPU64 conserve le chiffre sticky nécessaire à l’arrondi DoubleToAscii dans mormot.core.text ajoute maintenant un chiffre sticky synthétique non nul sur CPU64 comme sur CPU32 lorsque des bits supprimés subsistent au-delà de la précision demandée. d2a_k_comp remplace aussi le calcul logarithmique flottant par une estimation entière fixed-point inline, et la sortie exponentielle écrit un séparateur décimal dès que des chiffres fractionnaires conservés existent. Correctifs mormot.core.text f4433cf3+13-24

core: fixed DoubleToAscii()

Impact

Les builds Delphi 64 bits et FPC 64 bits peuvent produire des derniers chiffres différents pour les valeurs proches d’une égalité, en suivant maintenant l’arrondi au pair le plus proche avec la partie supprimée représentée. Les chaînes flottantes sérialisées deviennent plus fiables pour une relecture exacte ; les signatures ne changent pas.

API publique

  • DoubleToAsciibehaviour-changed — L’arrondi CPU64 tient maintenant compte des bits non nuls supprimés grâce à un chiffre sticky.

Arnaud Bouchez · 08:58 UTC · voir le commit sur GitHub →

3 Élevée Les exposants décimaux extrêmes atteignent les limites valides des doubles L’implémentation GetExtended hors WIN32DELPHI dans mormot.core.text ne rejette plus toutes les valeurs frac inférieures ou égales à -324. Pour la plage atteignable de -342 à -324, elle pré-multiplie d64 avant d’appliquer la puissance négative restante et autorise frac 308 à suivre le chemin existant protégé contre l’overflow. Correctifs mormot.core.text 56bb70cd+14-4

core: fixed GetExtended() on huge/tiny exponents

Impact

Les backends FPC et Delphi hors Win32 peuvent maintenant analyser des valeurs décimales valides aux limites du plus petit subnormal et du plus grand fini au lieu de signaler une erreur ou de les perdre prématurément. L’implémentation assembleur x87 de Delphi Win32 n’est pas modifiée par ce commit.

À regarder

Retestez les limites d’exposants acceptées et rejetées si la validation d’entrée dépend du retour err de GetExtended.

API publique

  • GetExtendedbehaviour-changed — Le chemin Pascal accepte des exposants extrêmes valides de double auparavant rejetés prématurément.

Arnaud Bouchez · 08:58 UTC · voir le commit sur GitHub →

4 Élevée Le zéro fractionnaire JSON redevient numérique GetNumericVariantFromJson dans mormot.core.variants ne quitte plus lorsqu’il rencontre un délimiteur après un ou plusieurs zéros fractionnaires. La fonction distingue l’absence du premier chiffre après le séparateur décimal d’une partie fractionnaire entièrement nulle terminée, et de nouveaux tests exigent que 0.0 et 0.000000000 renvoient un zéro varInteger. Correctifs mormot.core.variants 58178149+8-3

core: fixed regression in GetNumericVariantFromJson()

Impact

Le zéro numérique JSON avec séparateur décimal n’échoue plus dans ce parser numérique rapide et ne retombe plus sur une représentation non numérique dans les chemins de conversion supérieurs. Les services Delphi et FPC recevant 0.0 retrouvent le même résultat normalisé en zéro entier que les autres écritures de zéro.

API publique

  • GetNumericVariantFromJsonbehaviour-changed — Les formes JSON à partie fractionnaire entièrement nulle sont de nouveau analysées et normalisées en zéro varInteger.

Arnaud · 21:34 UTC · voir le commit sur GitHub →

5 Moyenne Les exposants appliqués à zéro suivent un chemin rapide sûr avant mise à l’échelle Le chemin Pascal de GetExtended dans mormot.core.text renvoie un zéro signed via l’épilogue commun de signe avant toute mise à l’échelle d’exposant lorsque v64 vaut zéro. Le calcul des très petits exposants est aussi regroupé pour multiplier d64, le facteur 1E-160 et la puissance inverse restante dans une seule expression. Correctifs mormot.core.text 8b5a85a4+19-7

core: refine some GetExtended() specific cases

Impact

Les backends FPC et Delphi hors Win32 acceptent 0E400 et 0E-400 sans erreur de plage et préservent le zéro négatif. Le code source existant ne nécessite aucun changement ; Delphi Win32 continue d’utiliser son parser assembleur distinct.

API publique

  • GetExtendedbehaviour-changed — Zéro reste valide malgré un très grand exposant, avec conservation de son signe.

Arnaud Bouchez · 09:13 UTC · voir le commit sur GitHub →

6 Moyenne Le format scientifique n’émet plus de séparateur décimal mal placé Dans mormot.core.text, d2a_return_exponential décide maintenant d’écrire le séparateur décimal après avoir limité n_digits_have à n_digits_req. Le séparateur est émis avec les chiffres significatifs fractionnaires plutôt qu’avant de connaître leur nombre final. Correctifs mormot.core.text 37212dc4+8-8

core: fixed DoubleToAscii() correctness of scientific notation

Impact

Le code Delphi et FPC existant conserve la même signature DoubleToAscii, mais certaines chaînes scientifiques limites peuvent changer pour adopter une ponctuation valide. Les consommateurs qui comparent le texte flottant octet par octet doivent mettre à jour les valeurs attendues après avoir pris la série complète.

À regarder

Rejouez les tests de sortie de référence qui comparent exactement la notation scientifique de DoubleToAscii.

API publique

  • DoubleToAsciibehaviour-changed — La sortie scientifique place le séparateur décimal seulement si des chiffres significatifs fractionnaires sont émis.

Arnaud Bouchez · 07:40 UTC · voir le commit sur GitHub →

7 Faible La couverture aller-retour s’étend aux signes, échelles et motifs de bits exacts test.core.base ajoute des cas DoubleToShort positifs et négatifs de 1.5E-19 à 2E19, des vecteurs exacts de QWord vers double et des contrôles GetExtended pour zéro avec de très grands exposants positifs ou négatifs. Il vérifie aussi une entrée TimeSpan avec un espace final. Tests a155bf80+34-3

tests: enhanced double / text conversion coverage

Impact

Aucun changement de code applicatif ni d’API publique. La suite étendue verrouille les allers-retours formateur/parser sous Delphi et FPC et documente que les contrôles exacts de limites GetExtended ne s’appliquent pas à WIN32DELPHI.

Arnaud Bouchez · 09:00 UTC · voir le commit sur GitHub →

8 Faible Les tests de conversion gagnent des vecteurs de limites exactes test.core.base ajoute des assertions bit à bit pour le plus petit subnormal, le plus grand double fini et d’autres limites, ainsi que des allers-retours en notation scientifique positifs et négatifs. Son helper local compare maintenant directement les valeurs ShortString. Tests 511fe932+25-8

tests: enhanced floating point conversion vectors

Impact

Aucun changement de code applicatif ni d’API publique. Les tests rendent observables les corrections ultérieures de limites du parser et du formateur sous Delphi et FPC, tandis que les contrôles bit à bit exacts de GetExtended restent exclus pour WIN32DELPHI.

Arnaud Bouchez · 07:41 UTC · voir le commit sur GitHub →

Activité upstream commits par jour · 60 derniers jours
Commits977
Jours actifs44/60
Plus chargé2026-09-30
Pic60
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