问题描述
我现在多次遇到相同的情况:我已经以给定的精度近似了给定函数(例如余弦),并且我希望在一定的时间间隔内以ulp为单位评估近似值的最大误差。 / p>
目前,我的方法是首先生成随机单精度值(我知道在此站点上有很多关于随机浮点数生成的讨论,这就是为什么我不想在这个问题中对此进行讨论,但是这是我的代码):
bool seedDone = false;
std::random_device rd;
std::default_random_engine re;
float Floatrandom(float Min,float Max)
{
if (!seedDone)
{
re = std::default_random_engine(rd());
seedDone = true;
}
//static std::default_random_engine e;
std::uniform_real_distribution<float> dis(Min,Max);
float x = dis(re);
if (x > Max || x < Min)
std::cout << "Error: value out of bounds!" << std::endl;
return x;
}
,使用我的近似值和参考(例如cmath cosf)计算三角函数,并使用以下方法比较结果:
int FloatCompareULP(float f1,float f2)
{
assert(sizeof(float) == sizeof(int));
int intDiff = abs(*(int*)&f1 - *(int*)&f2);
return intDiff;
}
我想像这样:
int calculateMaxULP(float(*approximation)(float),float(*reference)(float),float lowBound,float highBound)
但是对于随机浮点数,我只能给出最大误差不大于我评估的最大误差的可能性。
由于我的时间间隔太大,实际上不可能对所有现有的float进行迭代,而我将不得不迭代数十亿个值。
因此,我决定分小步“扫描”间隔,并更精确地搜索具有大错误的值。我同时确定,此方法不合适,因为对误差分布的评估表明,后者不是连续的。 [
另一方面,我已经看到很多关于不同问题的评论,这些评论争论最大ulp错误,因此实现方法并不难。
编辑:指定我的目标:我不是在寻找一种数学上正确的证明的方法,我只是想获得一个最大ulp计算值来近似最大误差。我认为我的路不是走的路。
如果您需要更多信息,请不要犹豫,我将编辑此问题以澄清误会。
谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)