Ich suche nach einem diff Tool, das auch Fließkommawerte (innerhalb einer Toleranz) in Textdateien vergleichen kann. Dies ist zusätzlich zu typischen Textvergleichs-Diff-Funktionen, mit Optionen zum Ignorieren von Leerzeichen, Ignorieren von Groß- und Kleinschreibung usw. Eine GUI (oder Vollbildschirm-Konsolen-Benutzeroberfläche) ist in Ordnung, aber ich würde eine Stream-orientierte (stdin / stdout) bevorzugen ) Werkzeug.
Hier ist ein extrem einfaches Beispiel, das das ideale Werkzeug charakterisiert. Es gibt 2 Versionen von foo.c:
foo_v1.c:
%Vor%foo_v2.c:
%Vor%Und hier ist die diff-Ausgabe, die ich erwarten würde:
%Vor%Der zweite Unterschied (Zeile 8) ist der übliche Textunterschied; Das erste diff (Zeile 6) ist darauf zurückzuführen, dass die Zahlen außerhalb der angegebenen Toleranz liegen. (Der Exponent sollte 16, nicht 18, also ist es um 100.0X).
Beachten Sie, dass keine der anderen Gleitkommaänderungen als Diffs angezeigt werden. Obwohl sie Textänderungen sind, ändern sich die Gleitkommawerte nicht über die angegebene Toleranz hinaus.
Gibt es ein Diff-Tool, das das kann?
Wenn nicht, gibt es etwas in der Nähe, das ist Open-Source?
Siehe Smart-Differenzierer-Tools . Diese Tools vergleichen zwei Quellcodedateien entsprechend der Programmstruktur im Gegensatz zum Vergleichen von Textzeilen. Um dies zu tun, analysieren diese Tools die Quelldatei gemäß den Sprachregeln, erstellen einen AST und vergleichen Bäume. Die Ausgabe bezieht sich auf abstrakte Bearbeitungsänderungen (Einfügen, Löschen, Verschieben, Kopieren, Umbenennen) in Programmstrukturen (Bezeichner, Ausdrücke, Anweisungen, Blöcke, Methoden, ...).
Als Nebeneffekt werden die einzelnen Sprachlexeme, wie Zeichen-, Zeichenfolgen- und numerische Literale, in eine normale Form interner Repräsentation umgewandelt. Das Format von Literal wird ignoriert, daher behandelt es Fließkommawerte wie 00.001 und 1e-03 als identisch, 0xFF und 255 als identisch und "\ n" und "\ u000a" als identisch. Dies beinhaltet keine Toleranzfuzz für Fließkommazahlen, aber es ignoriert ihre Form. Das bedeutet, dass die SmartDifference-Tools zwei entsprechende, aber leicht unterschiedliche Nummern als unterschiedlich melden, aber nur die Zahlen selbst melden; Du wirst etwas wie
bekommen %Vor%Der Matcher erlaubt derzeit die Unterscheidung von Bezeichnern und behandelt eine konsistente Bezeichnerumbenennung innerhalb eines Bereichs als einzelne Bearbeitung, statt als eine Reihe verschiedener Bearbeitungen. Die Idee, Fließkomma-Fuzz zu verwenden, um das Anpassen von Beinahe-Fp-Nummern zu ermöglichen, ist interessant; Ich füge es zur Liste der möglichen Funktionsanforderungen hinzu.
Diese Werkzeuge sind Produktion für Java, COBOL und C #. Wir haben Vorserienversionen für C ++ und C; Das Problem besteht darin, Programmstrukturen für Sprachen aufzugreifen, die eine beliebige Bearbeitung der Quelle durch Makros und Präprozessor-Bedingungen ermöglichen.
Ich bin mir eines solchen Tools nicht bewusst, aber es wäre ziemlich einfach, ein Perl-Skript zu erstellen, das das für Sie erledigt, indem Sie einige reguläre Ausdrücke für Fließkommazahlen mit einer Reihe von Routinen kombinieren, um die regulären Gleitkommazahlen zu normalisieren. Ich kann wahrscheinlich einen Schlag darauf machen, wenn du Hilfe brauchst, aber es ist ein zeitraubendes Unternehmen, also werde ich ein gieriges Schwein sein und nach einer nützlichen Beute fragen.
Tags und Links diff floating-point