10
votes

Outil diff qui ignore les formats de points flottants (mais pas les valeurs) dans le texte?

Je recherche un outil Diff fort> qui peut également comparer des valeurs de points flottants (dans une certaine tolérance) dans des fichiers texte. Cela s'ajoutent des fonctions typiques de la comparaison de texte, avec des options pour ignorer les espaces, Ignorer l'affaire, etc. Une interface graphique (ou une console à écran plein écran) est correcte, mais je préférerais vraiment une source d'orientation (stdin / stdout ) Outil.

Voici un exemple extrêmement simple qui caractérise l'outil idéal. Il existe 2 versions de FOO.C: P>

FOO_V1.C: P>

$ diff --floats=byvalue --tolerance=1e-9 foo_v1.c foo_v2.c
6c6
< #define C_SQUARED 89875517873681764.0L
---
> #define C_SQUARED 8.9875517873681764e18L
8c8
< const double AVO = 6.022e23; /* Avocado number */
---
> const double AVO = 6.022e23; /* Avogadro number */


0 commentaires

4 Réponses :


0
votes

Je ne suis pas au courant d'un tel outil, mais il serait assez facile de préparer un script Perl pour vous faire pour vous en combinant une expression régulière de pointe flottante de fantaisie définie avec un tas de routines pour normaliser lesdits flotteurs dégenturés. Je peux probablement prendre une balançoire à ce sujet si vous avez besoin d'aide, mais c'est une entreprise consommatrice beaucoup de temps, donc je serai un cochon gourmand et demander une prime utile.


4 commentaires

Merci pour votre offre. En fait, je cherche à écrire mon propre outil pour cela, mais je ne suis pas convaincu que les expulsions sont suffisantes pour les comparaisons dans une tolérance spécifiée.


Si vous roulez le nôtre, ce que vous voulez faire, c'est d'utiliser Math :: Hiérarchie de la bibliothèque (Math :: Bigfloat, je pense) éventuellement assorti à la meilleure réégycle à virgule flottante que vous pouvez trouver sur cpan ou construire vous-même - le livre de Perl Regexp a quelques belles. Si vous êtes chanceux, Math :: La hiérarchie a son propre analyseur (ne l'a pas utilisé pendant un moment, alors ne vous rappelez pas).


Un regexp ne peut raisonnablement être plié pour calculer des tolérances. Vous devez convertir les valeurs en flotteurs de machine et les comparer.


@Ira - tout à fait juste. Ainsi, le "avec un tas de routines pour normaliser lesdites floats non gigènes". partie de la réponse



5
votes

Il y en a celui-ci, qui semble très intéressant. J'essaie de le faire travailler sur mon Aix, alors je ne l'ai pas encore semblé en action, mais je crois que c'est ce que vous (et moi :-) besoin

http://hpux.connect.org.uk/hppd /hpux/text/Spiff-1.0/


5 commentaires

Wow! La sortie est exactement ce que je voulais! BTW, la version BEOS [ BeBits.com/appr/3784] compilé sous Cygwin sans changements.


Eh bien, je suis toujours incapable de le faire fonctionner sur Aix. Sur Linux, GCC-3.3.3 le compila, mais il segfault sur le premier "Smiff Sample.1 Sample.2". Sur une machine plus récente, GCC-4.2.4 est en colère pour: SPIFF.c: 178: Erreur: Déclaration statique de '_y_doargs' suit non-statique déclaration SPIFP.c: 30: erreur: déclaration précédente de '_y_doargs' était ici


@Davide: Si vous êtes toujours bloqué, vous devriez peut-être poser une question à ce sujet sur un site Web quelque part. ;-)


Bien sûr, mais pour le moment, je viens de demander à un ami exécutant Cygwin et ça a fonctionné :-)


Oh mec, il s'agit d'un code de la vieille école ... déclare fonction de fonction Types de fonction dans l'organisme de fonction, déclaration de fonction avant sans aucun argument ... variables sans faille à l'int ... Je reçois la même erreur que Davide sur Debian Linux à l'aide de GCC, mais il compile avec un avertissement bénin en utilisant ICC (compilateur C Intel's C).



1
votes

voir Smart Differencer Outils . Ces outils comparent deux fichiers de code source en fonction de la structure de programme, par opposition à la comparaison de lignes de texte. Pour ce faire, ces outils analysent le fichier source en fonction des règles de langue, construisent une AST et comparent des arbres. La sortie est en termes de modifications d'édition abstraites (insertion, suppression, déplacement, copie, renommée) aux structures de programme (identificateurs, expressions, états, blocs, méthodes, ...).

Effet secondaire, la langue individuelle Les lexemes, tels que le caractère, la chaîne et les littéraux numériques, sont convertis en une forme normale de représentation interne. Le format de littéral est ignoré, de sorte qu'il traitera des valeurs de point flottant telles que 00.001 et 1e-03 comme identique, 0xFF et 255 comme identique, et "\ n" et "\ u000a" comme identique. Cela n'inclut pas de fuzz de tolérance pour les nombres de points flottants, mais il ignore la forme de la forme. Cela signifie que les outils SmartDiffefence signaleront deux nombres correspondants mais légèrement différents comme différents, mais cela ne signalera que les chiffres eux-mêmes; vous obtiendrez quelque chose comme xxx

le matcheur permet actuellement identifiants d'être différent et traiter un identifiant cohérent renommant sur une portée comme une seule modification. qu'un tas de différentes modifications. L'idée d'utiliser du virage de points flottant pour permettre la correspondance des numéros de FP de près de Miss est intéressante; Je vais ajouter à la liste de demande de fonctionnalité possible.

Ces outils sont la production pour Java, Cobol et C #. Nous avons des versions de pré-production pour C ++ et C; La question dure est la prise en charge des structures de programme pour les langues qui permettent efficacement montage arbitraire de la silvèle via l'utilisation de macros et de conditionnels de préprocesseur.


2 commentaires

Certainement, une étape dans la direction que je voulais, et jolie mal au frais. Je suis curieux de savoir comment la "représentation interne" peut comparer les valeurs de point flottant sans tolérance. Je suppose que si vous êtes contraint aux littéraux (par opposition aux résultats du calcul), la tolérance n'est pas strictement nécessaire. Mais ce ne serait-il pas une fonctionnalité Nifty? ;-)


@System Pause: La comparaison des "représentations internes" est facile. Prenez la valeur ponctuelle flottante binaire et comparez-la à l'autre pour l'égalité. Ce n'est pas différent de comparer des identifiants ou des littéraux de chaînes.



8
votes

Celui que j'ai trouvé récemment:

http://www.nongnu.org/numdiff/

C'est très intuitif.


0 commentaires