Repository navigation
Test du chemin précis de cos : 45 arguments contre mpmath, et les outils de contrôle du port - #212
Merged
Merged
Conversation
…alues computed with mpmath
…d what it detects
…d a mutation test of the port
…, after the review
Jordan08
added a commit
that referenced
this pull request
Oct 27, 2026
This was referenced Oct 27, 2026
Jordan08
added a commit
that referenced
this pull request
Oct 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Suite de l'import de CORE-MATH
0b2ae6d1(27 octobre, commitscb731c0et2927cfepoussés directement surconfigure-cleanà la demande du mainteneur) : l'amont a réécritcos.cd'après le modèle desin.c, et GAOL le porte surgaol_u128(3rd/README.md). Le reste detests/core_math.cppcompare CORE-MATH à lui-même et ne peut pas voir une faute de ce port ; seulesin_accurate_path()le contrôlait, poursin. Cette pull request ajoute le test jumeau pourcos, avec des valeurs de référence indépendantes.Le test
cos_accurate_path()(tests/core_math.cpp) prend 45 arguments qui passent par le chemin précis decos.c(cos_large_accurate()) dans l'arrondi vers le haut, celui où GAOL calcule. Pour chacun :gaol_cr_cos(x)dans les quatre sens (au plus près, vers le haut, vers le bas, vers zéro) doit donner les arrondis de cos(x) calculés à part avec mpmath à 4 000 bits ;cos(interval(x))doit être[RD, RU], les bornes les plus serrées.Les arguments sont choisis pour atteindre les branches du chemin : la réduction de l'argument qui arrondit
kvers le haut ou non, l'indicei1det1 = i1 π/64sous 32, égal à 32 et au-dessus, les trois façons de combinercos(z) cos(r)etsin(z) sin(r)(somme, différence, différence avec changement de signe, qui n'arrive que près d'un multiple impair de π/2), chacune des 17 plages d'exposants de la table de 1/(2π) au-delà de 2^31, et les quatre arguments queexceptions()arrondit à part, avec leurs deux signes. Une copie instrumentée decos.c(compteurs danscos_large_accurate()) a servi à les trouver :tests/tools/cos/README.mddit comment.Mesures : 0,57 % des arguments de 2^-13 à 2^31 prennent ce chemin dans chacun des quatre arrondis (11 377 sur 2 millions dans l'arrondi vers le haut), tous ceux au-delà de 2^31 aussi.
Outils (
tests/tools/cos/)accurate_values.py: recalcule avec mpmath (4 000 bits) et des rationnels exacts les quatre arrondis de cos(x) pour chaque ligne de la table et les compare (code de sortie 1 sinon) ; avec--rowsil écrit les lignes d'arguments nouveaux. Il a des dents : un chiffre changé dans une ligne est signalé.mutate.py: met une erreur à la fois dans une ligne decos.cqui porte/* GAOL */et relance le test.README.md, et deux lignes dansdoc/tools.md.Dents du test
17 erreurs mises une à une dans
cos.c(le facteur 8 der, le+ 5des exceptions, une somme devenue différence, une comparaison inversée, le comptage de zéros deu128_tod(), un décalage de 64 devenu 63, les moitiés degaol_u128_make(V0, V1)échangées, le mot V2 pris dans_T[i+2], etc. : la liste est dansmutate.pyet le README), plus l'échange des moitiés de la macroU128pour-DGAOL_U128_EMULATION=ON. Avec le type natif et avec les moitiés forcées, le test échoue pour 15 des 17 (et pour l'échange des moitiés deU128). Les deux qui passent :k + 1:kn'est lu que par ses bits 0 à 12, le changement est équivalent ;+ 1demask + 1: le reste change de 2^-128, et 2,4 milliards d'appels decr_cos()comparés au fichier amont (6·10^8 arguments, quatre arrondis) n'ont pas montré une différence.Deux arguments entre 2^30 et 2^31, près d'un multiple impair de π/2, ont été ajoutés après qu'une erreur (le mot V2 pris dans le mauvais mot de la table) n'avait été vue par aucun autre. Limite : le test voit une faute qui déplace un résultat de plus de 2^-70 environ en relatif ; ses seuls arguments difficiles à arrondir sont ceux de
exceptions(), dontketnegsont nuls.Pour
doc/differences.mdetChangeLog(pull request de synthèse)Rien : un test et ses outils.
Relecture
Un relecteur indépendant (sous-agent, sans mon contexte) n'a trouvé aucun point bloquant. Il a :
cos.c: les 45 arguments prennent le chemin précis en arrondi vers le haut,iparcourt -1 à 16,negprend ses deux valeurs,i1est sous 32, égal à 32 et au-dessus, les trois branches de combinaison arrivent, les 8 lignes d'exceptions passent parexceptions();cos.cpar rapport à l'amont portent/* GAOL */et ne sont que des traductions d'opérateurs ;negtoujours nul,mask + 0oumask + 2, unk | 1<<20) ; sur 5 d'entre elles, 10^8 arguments tirés dans les quatre arrondis n'ont pas montré de différence.Corrigé à sa demande : le texte de
3rd/README.md(« 15 sur 17 » n'était pas vérifiable : la liste et la méthode sont maintenant danstests/tools/cos/, et la limite de 2^-70 est dite), le script qui recalcule les valeurs (absent : ajouté), le commentaire dei1, la mention que les lignes d'exceptions sont de 2^-23 à 2^-20 et passent par le chemin précis dans les trois arrondis dirigés seulement, et la phrase dedoc/tests.md. Il n'a pas pu compiler les sources amont (refusé par son bac à sable) : je l'ai fait moi-même, avec-O2 -frounding-math -ffp-contract=off, et elles donnent les 45 × 4 valeurs de mpmath.Vérifié en local
core_math(2 176 436 vérifications, 0 échec, les 45 × 2 decoscomprises) avec GCC 15.2 SSE2 en-Wall -Wextra -Werror, avec les moitiés forcées (-DGAOL_U128_EMULATION=ON), en FPU (-DGAOL_SIMD=OFF), avec Clang 18, en Debug avec ASan et UBSan (type natif et moitiés), sousLC_ALL=fr_FR.UTF-8, et sur Debian i386 (GCC 14.2, où le type 128 bits est les deux moitiés, par défaut et forcées). Avec gcov, toutes les lignes/* GAOL */decos.cs'exécutent danscore_math. Aucun fichier de build ne change (le test est dans un programme existant), donc ni autotools ni meson n'ont été relancés.Non vérifiable ici : Visual C++ (
/W4 /WX), clang-cl, MinGW-w64, MSYS2, macOS, ARM 32 bits, s390x, POWER, RISC-V et GCC 9 : seule la CI les couvre.Dépendances
Aucune. Elle touche
tests/core_math.cppcomme #206 (le déplacement du test de direction de CORE-MATH) : un conflit, s'il y en a un, se résout sans difficulté (fonctions différentes).Questions ouvertes
cos(le fichiercos.wcdes pires cas de l'amont n'est pas dans l'arbre) afin de voir aussi les fautes sous 2^-70 ? Ce serait une autre pull request.