2009-09-15 12 views
8

मैं diff उपकरण ढूंढ रहा हूं जो पाठ फ़ाइलों में फ़्लोटिंग पॉइंट मानों (कुछ सहिष्णुता के भीतर) की तुलना भी कर सकता है। यह सामान्य टेक्स्ट-तुलना diff फ़ंक्शंस के अतिरिक्त है, व्हाइटस्पेस को अनदेखा करने, केस को अनदेखा करने के विकल्प आदि के साथ। एक जीयूआई (या पूर्ण-स्क्रीन कंसोल यूआई) ठीक है, लेकिन मैं वास्तव में स्ट्रीम-ओरिएंटेड (stdin/stdout) पसंद करूंगा) उपकरण।डिफ टूल जो पाठ में फ़्लोटिंग-पॉइंट प्रारूपों (लेकिन मान नहीं) को अनदेखा करता है?

यहां एक बेहद सरल उदाहरण है जो आदर्श उपकरण को चित्रित करता है।

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; 
} 

और यहाँ diff उत्पादन मैं उम्मीद थी है:

$ 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 संस्करण हैं

दूसरा अंतर (रेखा 8) सामान्य पाठ अंतर है; पहला अंतर (रेखा 6) निर्दिष्ट सहिष्णुता के बाहर होने वाली संख्याओं के कारण है। (एक्सपोनेंट 16 होना चाहिए, 18 नहीं, इसलिए यह 100.0X से बंद है)।

ध्यान दें कि अन्य फ्लोटिंग पॉइंट परिवर्तनों में से कोई भी भिन्नता — के रूप में दिखाई नहीं देता है, भले ही वे टेक्स्ट परिवर्तन हों, फ़्लोटिंग पॉइंट मान निर्दिष्ट सहिष्णुता से आगे नहीं बदलते हैं।

क्या कोई अंतर उपकरण है जो यह कर सकता है?

यदि नहीं, तो क्या कुछ करीब है, यह खुला स्रोत है?

उत्तर

5

यह एक है, जो बहुत ही रोचक लग रहा है। मैं इसे अपने AIX पर काम कर रहा है करने के लिए कोशिश कर रहा हूँ, इसलिए मैं अभी तक इसे कार्य करता हुआ प्रतीत नहीं किया है, लेकिन मेरा मानना ​​है कि यह आप (और मैं क्या :-) जरूरत

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

+0

वाह! आउटपुट ** बिल्कुल ** ** मैं चाहता था! बीटीडब्ल्यू, बीओएस संस्करण [http://www.bebits.com/app/3784] सिग्विन के तहत संकलित किए बिना संकलित। –

+0

ठीक है, मैं अभी भी इसे AIX पर काम करने में असमर्थ हूं। लिनक्स पर, जीसीसी-3.3.3 ने संकलित किया, लेकिन यह पहले "स्पिफ नमूना 1 नमूना 2" पर segfault। एक नई मशीन पर, gcc-4.2.4 के लिए नाराज है: spiff.c: 178: त्रुटि: '_Y_doargs' की स्थिर घोषणा गैर स्थैतिक घोषणा spiff.c: 30: त्रुटि: '_Y_doargs' की पिछली घोषणा थी यहां – Davide

+0

@ डेवाइड: यदि आप अभी भी अटक गए हैं, तो शायद आपको किसी वेबसाइट पर इसके बारे में कोई प्रश्न पूछना चाहिए। ;-) –

0

मुझे इस तरह के उपकरण से अवगत नहीं है, लेकिन यह आपके लिए ऐसा करने के लिए एक पर्ल स्क्रिप्ट को चाबुक करना काफी आसान होगा, जो कि कुछ फैंसी फ्लोटिंग पॉइंट नियमित अभिव्यक्ति को नियमित रूप से कहा जाता है, जो कि रेगेक्सड फ्लोट्स को सामान्यीकृत करने के लिए नियमित रूप से सेट किया जाता है। यदि आपको मदद की ज़रूरत है तो मैं शायद उस पर स्विंग ले सकता हूं, लेकिन यह थोड़ा सा समय लेने वाला उद्यम है, इसलिए मैं एक लालची सुअर बनूंगा और उपयोगी बक्षीस मांगूंगा।

+0

आपके प्रस्ताव के लिए धन्यवाद। असल में मैं इसके लिए अपना स्वयं का टूल लिख रहा हूं, लेकिन मुझे विश्वास नहीं है कि निर्दिष्ट सहिष्णुता के भीतर तुलना के लिए रेगेक्स पर्याप्त हैं। –

+0

यदि आप अपना खुद का रोल करते हैं, तो आप मैथ :: लाइब्रेरी पदानुक्रम (मठ :: बिगफ्लैट मुझे लगता है) का उपयोग करना संभवतः सबसे अच्छा फ़्लोटिंग-पॉइंट रेगेक्सप से मेल खाता है जिसे आप सीपीएएन पर पा सकते हैं या खुद का निर्माण कर सकते हैं - पर्ल रेगेक्सप बुक कुछ अच्छे हैं। यदि आप भाग्यशाली हैं, तो मैथ :: पदानुक्रम का अपना पार्सर है (इसे थोड़ी देर के लिए उपयोग नहीं किया है इसलिए याद नहीं है)। – DVK

+0

एक regexp सहिष्णुता की गणना करने के लिए उचित रूप से झुकाव नहीं कर सकता है। आपको मूल्यों को मशीन फ्लोट में कनवर्ट करने और उनकी तुलना करने की आवश्यकता है। –

1

Smart Differencer Tools देखें है। टेक्स्ट टूल्स की तुलना करने के विपरीत, ये टूल प्रोग्राम संरचना के अनुसार दो स्रोत कोड फ़ाइलों की तुलना करते हैं। ऐसा करने के लिए, ये टूल भाषा नियमों के अनुसार स्रोत फ़ाइल को पार्स करते हैं, एएसटी बनाते हैं, और पेड़ों की तुलना करते हैं। आउटपुट प्रोग्राम संरचनाओं (पहचानकर्ताओं, अभिव्यक्तियों, बयान, ब्लॉक, विधियों, ...) में अमूर्त संपादन परिवर्तन (सम्मिलित, हटाएं, स्थानांतरित करें, प्रतिलिपि, नाम बदलें) के संदर्भ में है।

एक साइड इफेक्ट के रूप में, व्यक्तिगत भाषा लेक्सम, जैसे चरित्र, स्ट्रिंग और न्यूमेरिक अक्षर, को सामान्य रूप में आंतरिक रूप में परिवर्तित किया जाता है। शाब्दिक प्रारूप का अनदेखा किया जाता है, इसलिए यह 00.001 और 1e-03 जैसे समान, 0xFF और 255 समान के रूप में फ़्लोटिंग पॉइंट मानों का इलाज करेगा, और "\ n" और "\ u000a" समान होगा। इसमें फ्लोटिंग पॉइंट नंबरों के लिए सहिष्णुता फ़ज़ शामिल नहीं है, लेकिन यह अपने आकार को अनदेखा करता है।इसका अर्थ यह है कि SmartDifference टूल दो अलग-अलग लेकिन थोड़ी अलग संख्याओं की रिपोर्ट करेगा, लेकिन यह केवल संख्याओं की रिपोर्ट करेगा; आप मिल जाएगा कुछ

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

मिलान वर्तमान पहचानकर्ता अलग होने की अनुमति देता है और एक सुसंगत पहचानकर्ता विभिन्न संपादन के बजाय कि एक गुच्छा एक एकल संपादन के रूप में एक गुंजाइश भर में नाम बदलने व्यवहार करता है। निकट-मिस एफपी संख्याओं के मिलान की अनुमति देने के लिए फ़्लोटिंग पॉइंट फ़ज़ का उपयोग करने का विचार दिलचस्प है; मैं इसे संभावित सुविधा अनुरोध सूची में जोड़ दूंगा।

ये उपकरण जावा, कोबोल और सी # के लिए उत्पादन कर रहे हैं। हमारे पास सी ++ और सी के लिए प्रजनन संस्करण हैं; कठिन मुद्दा उन भाषाओं के लिए प्रोग्राम संरचनाओं को उठा रहा है जो मैक्रोज़ और प्रीप्रोसेसर सशर्तों के उपयोग के माध्यम से सॉस के मनमाने ढंग से संपादन की अनुमति देते हैं।

+0

निश्चित रूप से दिशा में एक कदम मैं चाहता था, और बहुत अच्छा ठंडा ठंडा। मैं उत्सुक हूं कि कैसे "आंतरिक प्रतिनिधित्व" सहिष्णुता के बिना फ़्लोटिंग-पॉइंट मानों की तुलना कर सकता है। मुझे लगता है कि यदि आप सचमुच (गणना परिणामों के विपरीत) के लिए बाध्य हैं, तो सहनशीलता सख्ती से जरूरी नहीं है। लेकिन क्या यह निफ्टी फीचर नहीं होगा? ;-) –

+0

@ सिस्टम पाउस: "आंतरिक प्रतिनिधित्व" की तुलना करना आसान है। बाइनरी फ्लोटिंग पॉइंट वैल्यू लें, और समानता के लिए दूसरे की तुलना करें। यह पहचानकर्ताओं या स्ट्रिंग अक्षर की तुलना करने से अलग नहीं है। –

संबंधित मुद्दे