【问题标题】:c++ half library has lower precision for positive numbersc ++半库对正数的精度较低
【发布时间】:2018-01-20 08:27:59
【问题描述】:

我知道我正在使用 C++ 中未内置的功能,但是,这个库似乎很常用,以至于我惊讶地看到这个错误弹出。

对于那些不了解图书馆的人,可以找到here。本质上,它应该允许支持 16 位浮点(低精度)数字。

我的问题是半浮点数的精度对于正数似乎会降低。

在这段代码中,我生成了一堆要渲染到屏幕上的点。 {xs1, ys1} 表示 sigmoid 的浮点精度计算。 {xs3, ys3} 表示转换为浮点精度的值。

vector<float> xs1, ys1, xs3, ys3;
int res = 200000;
for (int i = 0; i < res; i++)
{
    float prec = float(i) / float(res);
    float fx = ((perc - 0.5) * 2.0)*8.0;
    half hx = half(fx);
    float fy = MFunctions::sigmoid(fx);
    half hy = half(fy);

    xs1.push_back(fx);
    ys1.push_back(fy);

    xs3.push_back(float(hx));
    ys3.push_back(float(hy));
}

以下是结果(查看放大后生成的图表部分,窗口宽度为 2.2,窗口高度为 0.02 个单位):

查看浮动精度图时,sigmoid 函数的 {xs1, ys1} 两个角都是平滑的:

但是,当查看半精度图 {xs3, ys3} 时,正 x 轴上的角显示步进效果,而负 x 轴上的角显示较低分辨率但平滑的图形:

我不确定为什么会发生这种情况,因为正数和负数之间的唯一区别应该是符号位。

是我做错了什么还是半库中的缺陷?

【问题讨论】:

  • sigmoid的值不就是[0;1]吗?所以这是完全正常的,在 1 左右,精度远低于 0 左右。
  • 哦,你是对的!我试着翻译它,看到两边都出现了阶梯效应。请随意写下这个作为答案,以便我接受。

标签: c++ precision


【解决方案1】:

Sigmoid函数输出值为[0;1],所以你看到的是正常的:在下图中,值在1左右,所以精度远低于0左右。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多