簡體   English   中英

cuda雙精度對數誤差

[英]cuda double precision logarithm error

我使用C表示CUDA 3.0的計算能力,並且必須使用雙精度的內置對數函數。 我發現為此我應該使用double log(double x)函數( 文檔 )。 但是,如果我在雙精度范圍內傳遞一個非常小的數字(例如, double x = 6.73E-42 ),則log(x)函數返回-Infinity 在Java Math.log()函數中,相同的值返回-94.802 這是CUDA數學庫中的錯誤還是我得錯了?

編輯:這是我在內核函數中使用的代碼

#include "math.h"
extern "C"
__global__ void smallLog(double* in, int n)
{
   int i = blockIdx.x * blockDim.x + threadIdx.x;
   if (i<n){
      double x = in[i];
      in[i] = log(x);
   }
}

確保您正在編譯計算能力3.0( nvcc -arch sm_30 )。

默認情況下,nvcc為計算能力1.0編譯,這只是單精度而且(正如其他人已經指出的那樣)6.73E-42在單精度中為零,log(0)= -Infinity。

對於你的問題,答案應該是-94.802。

嘗試將log(6.73E-42)拆分為

log(6.731E-20) + log(1E-22) = [(-44.145)+(-50.66)]=(-94.802)

或者,如果你想要,你可以分成更多的部分,最后添加。 很抱歉,我的設備不支持雙精度。 這就是我能給出的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM