![](/img/trans.png)
[英]The precision of the natural logarithm is not correct in CLISP. What might be wrong?
[英]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.