为了验证,我希望能够计算出在特定算术计算中舍入到可表示值所导致的累积误差的合理上限。
假设我们有一个名为
我想通过以一种追踪最坏情况下误差的方式进行计算来验证
我想可以通过引入一个新的算术类
假设,例如,
当然,任何形式的帮助都受欢迎,但指向免费且有效代码的指针将非常好。
我在这些链接上找到了相关内容,但它们似乎并没有直接回答我的问题。
假设我们有一个名为
foo()
的函数声称执行某个特定算术计算。同时假设该涉及类型为float
或double
和foo()
执行计算的被隐含保证对最大舍入误差(由此产生)的方式(或者说明)。我想通过以一种追踪最坏情况下误差的方式进行计算来验证
foo()
的结果是否与特定输入值集的计算结果足够接近,然后检查这两个结果是否与最终最坏情况下误差要求足够接近。我想可以通过引入一个新的算术类
track_prec<T>
,向基本浮点数类型之一添加精度跟踪,然后让该类的算术运算符的实现计算每个子表达式的最坏情况下误差。我的问题是我不知道如何在这些一般情况下计算这些最坏情况下的误差。// T = float or double
template<class T> class track_prec {
public:
T value;
T ulp; // http://en.wikipedia.org/wiki/Unit_in_the_last_place
track_prec& operator+=(const track_prec& v)
{
value += v.value;
ulp = ???; // How to do this? And what about -=, *=, and /=?
}
friend bool operator==(T, const track_prec&)
{
// Exactly how should this comparison be done?
}
};
假设,例如,
foo()
是对一系列数字的简单求和。那么我们可以按照以下方式使用 track_prec<T>
:std::vector<T> values { 0.4, -1.78, 1.3E4, -9.29E3, ... };
CHECK_EQUAL(std::accumulate(values.begin(), values.end(), track_prec<T>()),
foo(values.begin(), values.end()));
当然,任何形式的帮助都受欢迎,但指向免费且有效代码的指针将非常好。
我在这些链接上找到了相关内容,但它们似乎并没有直接回答我的问题。