2009-09-15 47 views
8

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?

cevap

5

Bu çok ilginç görünen bir tane var. Bunun benim AIX üzerinde çalışan yaşamaya çalışıyorum, bu yüzden henüz eylem görünmüyor, ama ben bu (ve Smart Differencer Tools Bkz

http://hpux.connect.org.uk/hppd/hpux/Text/spiff-1.0/

+0

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. –

+0

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

+0

@Davide: Hala takıldınız, belki bir web sitesinde bu konuda bir soru sormalısınız. ;-) –

0

Böyle bir aracın farkında değilim, ancak bir Perl betiğinin, söz konusu düzenli ifadeleri normalleştirmek için bir dizi rutinle birlikte bazı süslü kayan noktalı düzenli ifade kümesini birleştirerek sizin için yapması oldukça kolay olacaktır. Yardıma ihtiyaç duyarsanız muhtemelen bir salıncak alabilirim, ama biraz zaman alıcı bir işletme olur bu yüzden açgözlü bir domuz olacağım ve faydalı bir ödül isteyeceğim.

+0

Teklifiniz için teşekkür ederiz. Aslında bunun için kendi aracımı yazmayı düşünüyordum, ancak rejimlerin, belirli bir tolerans dahilinde karşılaştırmalar için yeterli olduğuna inanmıyorum. –

+0

Eğer kendi başımızı döndürürseniz, yapmak istediğiniz şey, Math :: library hiyerarşisini (Math :: BigFloat sanırım) kullanmaktır, muhtemelen CPAN'da bulabileceğiniz veya kendiniz inşa edebileceğiniz en iyi kayan nokta regexp ile eşleşir - Perl Regexp kitabı bazı güzelleri var. Eğer şanslıysanız, Math :: hierarchy kendi ayrıştırıcısına sahiptir (bir süredir kullanmayın, o yüzden hatırlamayın). – DVK

+0

Bir regexp, toleransları hesaplamak için makul şekilde bükülemez. Değerleri makine şamandıralarına dönüştürmeniz ve karşılaştırmanız gerekir. –

1

:-) ne gerek olduğuna inanıyoruz. Bu araçlar, metin satırlarını karşılaştırmanın aksine, iki kaynak kod dosyasını program yapısına göre karşılaştırır. Bunu yapmak için, bu araçlar kaynak dosyayı dil kurallarına göre ayrıştırır, AST oluşturur ve ağaçları karşılaştırır. Çıktı, yapıları (tanımlayıcılar, ifadeler, ifadeler, bloklar, yöntemler, ...) programlamak için soyut düzenleme değişiklikleri (ekleme, silme, taşıma, kopyalama, yeniden adlandırma) bakımındandır. Bir yan etki olarak, karakter, dizgi ve sayısal değişmezler gibi tekil dil sözlükleri normal biçimdeki iç gösterime dönüştürülür. Değişmez formatı göz ardı edilir, bu yüzden 00.001 ve 1e-03 gibi kayan nokta değerlerini aynı, 0xFF ve 255 aynı ve "\ n" ve "\ u000a" aynıdır. Bu, kayan nokta sayıları için bir tolerans havlaması içermez, ancak bu şekilleri yok sayar.Bunun anlamı, SmartDifference araçlarının iki farklı fakat biraz farklı sayıları farklı olarak raporlamasıdır, ancak sadece sayıları kendileri rapor edecektir; Eğer eşleştirme aracı halen tanımlayıcıları farklı olmasını sağlar ve tek bir düzenleme olarak bir kapsam üzerinde farklı düzenlemelerin yerine bir demet yeniden adlandırma tutarlı bir tanımlayıcı davranır şey

<Line 75 col 15-19 1.01 
    >replace by Line 75 col 15-19 1.02 

gibi alırsınız. Yakın fp sayılarının eşleşmesine izin vermek için kayan nokta fuzz kullanma fikri ilginçtir; Olası özellik istek listesine ekleyeceğim.

Bu araçlar Java, COBOL ve C# üretimi içindir. C++ ve C için üretim öncesi sürümlerimiz var; Asıl mesele, makroların ve önişlemci koşullarının kullanımı yoluyla, isteğin keyfi şekilde düzenlenmesine olanak tanıyan diller için program yapılarını toplamaktır. Geçenlerde bulundu

+0

Kesinlikle istediğim yöne doğru bir adım attı ve çok güzeldi. "İçsel gösterimin" kayan nokta değerlerini hoşgörüsüz olarak nasıl karşılaştırabileceğini merak ediyorum. Eğer edebi değerlerle sınırlıysanız (hesaplama sonuçlarının aksine), tolerans kesinlikle gerekli değildir. Ama şık bir özellik olmaz mıydı? ;-) –

+0

@system DURAKLAT: "içsel gösterimleri" karşılaştırmak kolaydır. İkili kayan nokta değerini alın ve diğerine eşitlikle karşılaştırın. Bu, tanımlayıcıları veya dize değişmezlerini karşılaştırmaktan farklı değildir. –

İlgili konular