Estoy buscando una herramienta diff que también puede comparar valores de coma flotante (dentro de cierta tolerancia) en archivos de texto. Esto es además de las típicas funciones de comparación de texto, con opciones para ignorar espacios en blanco, ignorar mayúsculas y minúsculas, etc. Una GUI (o una interfaz de usuario de consola de pantalla completa) está bien, pero realmente preferiría un flujo orientado (stdin/stdout herramienta)¿Herramienta Diff que ignora los formatos de coma flotante (pero no los valores) en el texto?
Aquí hay un ejemplo extremadamente simple que caracteriza a la herramienta ideal. Hay 2 versiones de 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;
}
y aquí está la salida del diff que cabe esperar:
$ 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 */
La segunda diferencia (línea 8) es la diferencia de texto habitual; la primera diferencia (línea 6) se debe a que los números están fuera de la tolerancia especificada. (El exponente debe ser 16, no 18, entonces está apagado por 100.0X).
Tenga en cuenta que ninguno de los otros cambios de punto flotante aparecen como diffs — aunque sean cambios de texto, los valores de punto flotante no cambian más allá de la tolerancia especificada.
¿Hay alguna herramienta de diferencias que pueda hacer esto?
Si no, ¿hay algo cercano, eso es de código abierto?
¡Guau! ¡La salida es ** exactamente ** lo que quería! Por cierto, la versión BeOS [http://www.bebits.com/app/3784] compilada bajo Cygwin sin cambios. –
Bueno, todavía no puedo hacerlo funcionar en AIX. En Linux, gcc-3.3.3 lo compiló, pero segfault en el primer "spiff Sample.1 Sample.2". En una máquina más nueva, gcc-4.2.4 está enojado por: spiff.c: 178: error: la declaración estática de '_Y_doargs' sigue a la declaración no estática spiff.c: 30: error: la declaración anterior de '_Y_doargs' era aquí – Davide
@Davide: si todavía estás atascado, tal vez deberías hacer una pregunta al respecto en algún sitio web en alguna parte. ;-) –