2017-08-11 63 views
0

我知道我使用的是沒有內置到C++的功能,但是這個庫看起來很常用,我很驚訝地發現這個錯誤會彈出。這是C++半庫的問題嗎?

對於那些不瞭解圖書館的人可以找到here。本質上,它應該允許支持16位浮點數(較低精度)。

我的問題是,半數的精度似乎減少了正數。

在這段代碼中,我正在生成一堆要通過OpenGl呈現到屏幕上的點。 {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單位的窗口高度的曲線圖的部分放大):

當尋找在浮動精度曲線圖中,{ XS1,YS1}兩個S形函數的角部是平滑: enter image description hereenter image description here

但是,着眼於半精度圖表{XS3,YS3}在正x軸的角時顯示,而角步進效果在負x軸顯示較低的分辨率,但s mooth圖: enter image description hereenter image description here

我不知道爲什麼發生這種情況,因爲正數和負數之間唯一的區別應該是一個符號位。

有沒有什麼事是我做的還是這是在半庫中的漏洞?

+0

低得多是不是它的情況下那個sigmoid值是[0; 1]?所以這是完全正常的,圍繞1,精度比0附近 – geza

+0

哦,你是對的要低得多!我試了一下翻譯,看見階梯效應出現在兩側。隨意寫一個答案,所以我可以接受它。 – CalebK

回答

0

Sigmoid函數的輸出值是[0; 1],所以你看到的就是正常:在底部的圖片,值約爲1,因此精度比0附近