在文本中忽略浮点格式(但不是值)的Diff工具?

sys*_*USE 8 floating-point diff

我正在寻找一个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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

这是我期望的差异输出:

$ 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 */
Run Code Online (Sandbox Code Playgroud)

第二个差异(第8行)是通常的文本差异; 第一个差异(第6行)是由于数字超出了规定的公差.(指数应为16,而不是18,所以它是100.0X).

请注意,没有其他浮点更改显示为差异 - 即使它们是文本更改,浮点值也不会更改超出指定的容差.

有没有可以做到这一点的差异工具?

如果没有,是否有接近的东西,这是开源的吗?

小智 7

我最近发现的那个:

http://www.nongnu.org/numdiff/

这非常直观.


Dav*_*ide 5

有一个,看起来很有趣.我正试图让它在我的AIX上工作,所以我似乎还没有采取行动,但我相信这就是你(和我:-)需要的

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