我正在使用C for CUDA 3.0计算能力并且必须使用
内置双精度对数函数。我找到了
我应该使用double log(double x)
函数(documentation)。
但是,如果我在双精度范围内传递一个非常小的数字
(例如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);
}
}
答案 0 :(得分:3)
确保您正在编译计算能力3.0(nvcc -arch sm_30
)。
默认情况下,nvcc为计算能力1.0编译,这只是单精度而且(正如其他人已经指出的那样)6.73E-42在单精度中为零,log(0)= -Infinity。
答案 1 :(得分:0)
对于你的问题,答案应该是-94.802。
尝试将log(6.73E-42)
拆分为
log(6.731E-20) + log(1E-22) = [(-44.145)+(-50.66)]=(-94.802)
或者,如果你想要,你可以分成更多的片段,最后添加。很抱歉,我的设备不支持双精度。这就是我能给出的答案。