Sto cercando uno strumento diff che può anche confrontare i valori in virgola mobile (con una certa tolleranza) nei file di testo. Questo è in aggiunta alle tipiche funzioni di confronto testo-confronto, con opzioni per ignorare gli spazi bianchi, ignorare le maiuscole, ecc. Una GUI (o interfaccia utente della console a schermo intero) va bene, ma preferirei un flusso orientato (stdin/stdout) strumento.Strumento differenziale che ignora i formati in virgola mobile (ma non i valori) nel testo?
Ecco un esempio estremamente semplice che caratterizza lo strumento ideale. Ci sono 2 versioni di foo.c:
foo_v1.c:
#include <stdio.h>
#define PI 3.14159265359
#define E_CUBED 20.0855
#define HALF_PHI 0.809f
#define C_SQUARED 89875517873681764.0L
const double AVO = 6.022e23; /* Avocado number */
int main()
{
printf("%g %g %g %Lg %g\n", PI, E_CUBED, HALF_PHI, C_SQUARED, AVO);
return 0;
}
foo_v2.c:
#include <stdio.h>
#define PI 3.14159265358979
#define E_CUBED 2.00855e+1
#define HALF_PHI 8.09e-1f
#define C_SQUARED 8.9875517873681764e18L
const double AVO = 6.022e23; /* Avogadro number */
int main()
{
printf("%g %g %g %Lg %g\n", PI, E_CUBED, HALF_PHI, C_SQUARED, AVO);
return 0;
}
Ed ecco l'output di diff che ci si aspetta:
$ 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 */
Il secondo diff (riga 8) è la normale differenza di testo; il primo diff (riga 6) è dovuto al fatto che i numeri sono al di fuori della tolleranza specificata. (L'esponente dovrebbe essere 16, non 18, quindi è spento di 100.0X).
Nota che nessuna delle altre modifiche in virgola mobile viene visualizzata come differenza — anche se si tratta di modifiche di testo, i valori in virgola mobile non cambiano oltre la tolleranza specificata.
C'è uno strumento diff in grado di fare ciò?
In caso contrario, c'è qualcosa di simile, è open source?
Wow! L'output è ** esattamente ** quello che volevo! Btw, la versione di BeOS [http://www.bebits.com/app/3784] compilata sotto Cygwin senza modifiche. –
Beh, non riesco ancora a farlo funzionare su AIX. Su Linux, gcc-3.3.3 lo ha compilato, ma segfault sul primo "spiff Sample.1 Sample.2". Su una macchina nuova, gcc-4.2.4 è arrabbiato per: spiff.c: 178: errore: la dichiarazione statica di "_Y_doargs" segue la dichiarazione non statica spiff.c: 30: errore: la precedente dichiarazione di "_Y_doargs" era qui – Davide
@Davide: se sei ancora bloccato, forse dovresti fare una domanda al riguardo su qualche sito web da qualche parte. ;-) –