Agir maintenantpeut affecter un système en productionLe payload brut ne contient aucun marqueur superseded_by. Les diffs consécutifs intégrés montrent néanmoins une correction explicite de régression dans GetNumericVariantFromJson et plusieurs corrections cumulatives de conversion. Le commit aa165fe9 et son merge n’incrémentent pas mormot.commit-num.inc au-delà de 16851 ; le SHA complet d’arrivée est donc important.
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.
8 sur 8 entrées · 9 commits upstream
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.
Mise à jour recommandée
Prenez le head fusionné c9eff241 et rejouez les comparaisons numériques exactes, hashes ou tests de valeurs persistées qui dépendent des bits du double analysé.
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.
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.
Mise à jour recommandée
Mettez à niveau jusqu’à la révision finale c9eff241 et rejouez les allers-retours exacts de sérialisation flottante sur CPU64.
API publique
DoubleToAsciibehaviour-changed — L’arrondi CPU64 tient maintenant compte des bits non nuls supprimés grâce à un chiffre sticky.
Unités
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.
Unités
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.
Mise à jour recommandée
Dépassez les builds 2.4.16844–2.4.16850 et testez les champs JSON susceptibles de contenir 0.0 ou un zéro avec des chiffres fractionnaires finaux.
API publique
GetNumericVariantFromJsonbehaviour-changed — Les formes JSON à partie fractionnaire entièrement nulle sont de nouveau analysées et normalisées en zéro varInteger.
Unités
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.
Unités
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.
Unités
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.
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.