【发布时间】: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 左右。
-
哦,你是对的!我试着翻译它,看到两边都出现了阶梯效应。请随意写下这个作为答案,以便我接受。