代码之家  ›  专栏  ›  技术社区  ›  system PAUSE

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

  •  8
  • system PAUSE  · 技术社区  · 16 年前

    我在找一个 差异

    下面是一个非常简单的示例,描述了理想工具的特征。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)。

    是否有一个diff工具可以做到这一点?

    4 回复  |  直到 16 年前
        1
  •  8
  •   mfolusiak    12 年前

    我最近发现的一个:

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

    这很直观。

        3
  •  1
  •   Ira Baxter    16 年前

    看见 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
    

    匹配器目前允许 标识符 不同,并将跨作用域重命名的一致标识符视为单个编辑,而不是一组不同的编辑。使用浮点模糊匹配未遂fp数的想法很有趣;我将把它添加到可能的功能请求列表中。

    这些工具是针对Java、COBOL和C的产品。我们有C++和C的预制作版本;困难的问题是为那些通过使用宏和预处理器条件有效地允许对资源进行任意编辑的语言选择程序结构。

        4
  •  0
  •   Bart Tomer W    13 年前

    我不知道有这样的工具,但通过将一些奇特的浮点正则表达式集与一系列例程结合起来,以规范化所述正则表达式浮点值,就可以很容易地为您编写一个Perl脚本。如果你需要帮助的话,我可能会尝试一下,但这有点费时,所以我会成为一只贪婪的猪,请求一份有用的赏金。