Metin dosyalarındaki kayan nokta değerlerini (bazı toleranslar dahilinde) karşılaştırabilen bir diff aracını arıyorum. Bu, normal metin karşılaştırma fark fonksiyonlarına ek olarak, boşlukları yok saymak, davayı görmezden gelmek gibi seçeneklerle birlikte. Bir GUI (veya tam ekran konsolu UI) tamam, ama ben gerçekten bir akış yönelimli tercih ederim (stdin/stdout) aracı.Metin içinde kayan nokta biçimlerini (değerleri değil) yoksayan araç mı?
İşte ideal aracı karakterize eden son derece basit bir örnek.
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: Burada
#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;
}
Ve diff çıktı ben beklediğiniz oluyor:
$ 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 */
foo.c 2 versiyonu vardır
İkinci fark (satır 8), normal metin farkıdır; İlk fark (satır 6), belirtilen toleransın dışında olan sayılardan kaynaklanır. (Üs 17, 16 değil, 100.0X kapalı olmalıdır).
Metin değişiklikleri olsa da, diğer kayan nokta değişikliklerinden hiçbirinin diffs — görünmediğine dikkat edin, kayan nokta değerleri belirtilen toleransın ötesine geçmez.
Bunu yapabilecek bir fark aracı var mı?
Değilse, yakın bir şey var mı, açık kaynak?
Vay! Çıktı ** tam olarak ne istediğimi **! Btw, BeOS sürümü [http://www.bebits.com/app/3784] hiçbir değişiklik olmadan Cygwin altında derlenmiştir. –
Eh, hala AIX üzerinde çalışamıyorum. Linux'ta, gcc-3.3.3'ü derlemişti, ancak ilk "spiff Sample.1 Sample.2" üzerinde segfault. Daha yeni bir makinede, gcc-4.2.4 için kızgın: spiff.c: 178: hatası: '_Y_doargs' statik bildirimi, statik olmayan bildirimi izler spiff.c: 30: error: '_Y_doargs' önceki bildirimi Burada – Davide
@Davide: Hala takıldınız, belki bir web sitesinde bu konuda bir soru sormalısınız. ;-) –