单精度逼近的最大ulp偏差的实现

问题描述

我现在多次遇到相同的情况:我已经以给定的精度近似了给定函数(例如余弦),并且我希望在一定的时间间隔内以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进行迭代,而我将不得不迭代数十亿个值。

因此,我决定分小步“扫描”间隔,并更精确地搜索具有大错误的值。我同时确定,此方法不合适,因为对误差分布的评估表明,后者不是连续的。 [

error distribution on 0,pi

另一方面,我已经看到很多关于不同问题的评论,这些评论争论最大ulp错误,因此实现方法并不难。

编辑:指定我的目标:我不是在寻找一种数学上正确的证明的方法,我只是想获得一个最大ulp计算值来近似最大误差。我认为我的路不是走的路。

如果您需要更多信息,请不要犹豫,我将编辑此问题以澄清误会。

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)