算法求解的模糊/近似检验

时间:2010-01-11 07:03:45

标签: algorithm build-process build-automation

我们有人在我们拥有的一些超级计算机上运行代码进行模拟,测试等。更好的是,如果作为构建过程的一部分,我们可以检查不仅代码编译,而且输出匹配某些模式,这表明我们正在获得有意义的结果。

即。研究人员可能知道x的值必须在某个范围内。如果没有,那么代码中就会出现逻辑错误(假设它编译并且它们没有编译时错误)。

是否有任何预先写好的包裹用于此类事情。代码用FORTRAN,C,C ++等编写。

任何具体或一般性建议都将受到赞赏。

3 个答案:

答案 0 :(得分:1)

我希望大多数单元测试框架可以做到这一点;提供玩具测试数据集,并以各种不同的方式看到答案是正确的。

答案 1 :(得分:0)

确保任何计算(无论是最终的还是中间的)的结果值满足某些约束的好方法是使用面向对象的编程语言(如C ++),并定义内部强制执行检查条件的数据类型对于。然后,您可以将这些数据类型用作任何计算的返回值,以确保返回的值满足所述条件。

让我们看一个简单的例子。假设您在飞机类内部具有成员功能,作为飞行控制系统的一部分,该系统根据乘客的数量和该时刻飞机的燃料量来估算飞机实例的质量。声明Airplane类和airplaneMass()成员函数的一种方法如下:

class Airplane {
public:

    ...

    int airplaneMass() const; // note the plain int return type

    ...

private:
    ...
};

但是,实现上述方法的更好方法是定义一个类型 AirplaneMass ,它可以用作函数的返回类型而不是 int AirplaneMass 可以在内部确保(在其构造函数和任何重载运算符中)它封装的值满足某些约束。 AirplaneMass数据类型的示例实现可能如下:

class AirplaneMass {
public:

    // AirplaneMass constructor
    AirplaneMass(int m) {
        if (m < MIN || m > MAX) {
            // throw exception or log constraint violation
        }

        // if the value of m meets the constraints,
        // assign it to the internal value.
        mass_ = m;
    }

    ...

    /* range checking should also be done in the implementation
       of overloaded operators. For instance, you may want to
       make sure that the resultant of the ++ operation for
       any instance of AirplaneMass also lies within the
       specified constraints. */

private:
    int mass_;
};

此后,您可以按如下方式重新声明班级Airplane及其airplaneMass()成员函数:

class Airplane {
public:

    ...

    AirplaneMass airplaneMass() const;
    // note the more specific AirplaneMass return type

    ...

private:
    ...
};

以上将确保airplaneMass()返回的值介于MIN和MAX之间。否则,将抛出异常,或者将记录错误条件。

答案 2 :(得分:0)

本月我必须为转换做到这一点。我不知道这对你是否有帮助,但对我来说这似乎很简单。

首先,我定义了容差水平。 (Java-ish示例代码......)

private static final double TOLERANCE = 0.000000000001D;

然后我定义了一个新的“areEqual”方法,该方法检查两个值之间的差异是否低于容差水平。

private static boolean areEqual(double a, double b) {
    return (abs(a - b) < TOLERANCE);
}

如果我在某处获得false,则表示检查可能已失败。我可以调整公差,看它是否只是一个精度问题或者是一个糟糕的结果。在我的情况下运作得很好。