我正在寻找一个 diff 工具,它还可以比较文本文件中的浮点值(在一定容差范围内)。这是典型的文本比较差异函数的补充,具有忽略空格,忽略大小写等的选项.GUI(或全屏控制台UI)是可以的,但我真的更喜欢面向流(stdin / stdout) )工具。
这是一个非常简单的例子,是理想工具的特征。有两个版本的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;
}
这是我期望的差异输出:
$ 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 */
第二个差异(第8行)是通常的文本差异;第一个差异(第6行)是由于数字超出了规定的公差。 (指数应为16,而不是18,所以它偏离100.0X)。
请注意,其他任何浮点更改都不会显示为差异 - 即使它们是文本更改,浮点值也不会更改超出指定的容差。
是否有可以做到这一点的差异工具?
如果没有,是否有接近的东西,那是开源的?
答案 0 :(得分:7)
答案 1 :(得分:5)
有一个,看起来很有趣。我正试图让它在我的AIX上运行,所以我似乎还没有采取行动,但我相信这就是你(和我:-)需要的
答案 2 :(得分:1)
见Smart Differencer Tools。这些工具根据程序结构比较两个源代码文件,而不是比较文本行。为此,这些工具根据语言规则解析源文件,构建AST并比较树。输出是对程序结构(标识符,表达式,语句,块,方法等)的抽象编辑更改(插入,删除,移动,复制,重命名)。
作为副作用,单个语言词汇(如字符,字符串和数字文字)将转换为普通表单内部表示。文字的格式被忽略,因此它将浮点值(如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
匹配器目前允许标识符不同,并将范围内的一致标识符重命名视为单个编辑,而不是一堆不同的编辑。使用浮点模糊来匹配近未命中fp数的想法很有意思;我将它添加到可能的功能请求列表中。
这些工具适用于Java,COBOL和C#。我们有C ++和C的预生产版本;困难的问题是采用语言的程序结构,通过使用宏和预处理器条件有效地允许任意编辑源。
答案 3 :(得分:0)
我不知道这样的工具,但通过将一些花哨的浮点正则表达式集合与一系列例程相结合来规范化所述正则表达式浮点数,可以相当容易地为您完成这项工作。如果你需要帮助的话,我可以采取行动,但这需要一点时间的企业,所以我将成为一头贪婪的猪,并要求有用的赏金。