cuda双精度对数误差

时间:2012-09-08 18:12:36

标签: math cuda logarithm double-precision

我正在使用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);
   }
}

2 个答案:

答案 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)

或者,如果你想要,你可以分成更多的片段,最后添加。很抱歉,我的设备不支持双精度。这就是我能给出的答案。