Math 双精度对数误差

Math 双精度对数误差,math,cuda,logarithm,double-precision,Math,Cuda,Logarithm,Double Precision,我在3.0计算能力上使用C为CUDA,必须使用 内置双精度对数函数。我为你找到的 为此,我应该使用double log(double x)函数()。 但是,如果我在双精度范围内传递一个非常小的数字 (例如,双x=6.73E-42), log(x)函数返回-无限。在JavaMath.log()函数中 值返回-94.802。这是CUDA数学库中的一个bug还是我出了什么问题 编辑: 这是我在内核函数中使用的代码 #include "math.h" extern "C" __global__ void

我在3.0计算能力上使用C为CUDA,必须使用 内置双精度对数函数。我为你找到的 为此,我应该使用
double log(double x)
函数()。 但是,如果我在双精度范围内传递一个非常小的数字 (例如,
双x=6.73E-42
),
log(x)
函数返回
-无限
。在Java
Math.log()函数中
值返回
-94.802
。这是CUDA数学库中的一个bug还是我出了什么问题

编辑: 这是我在内核函数中使用的代码

#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);
   }
}
#包括“math.h”
外部“C”
__全局无效小日志(双*英寸,整数n)
{
int i=blockIdx.x*blockDim.x+threadIdx.x;

如果(i对于你的问题,答案应该是-94.802

尝试将
日志(6.73E-42)
拆分为

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


或者,如果您愿意,您可以分成更多的部分,最后添加。对不起,我的设备不支持双精度。这是我可以给出的答案。

请确保您是为compute capability 3.0(
nvcc-arch sm_30
)编译的


默认情况下,nvcc编译的计算能力为1.0,仅为单精度,并且(正如其他人已经指出的)6.73E-42在单精度和log(0)中为零=-无穷大。

CUDA可能使用
float
s进行计算。然后6.73E-42为0。您可以通过检查SM版本来检查硬件是否支持双精度:cudaDeviceProp的主要/次要成员,或cuDeviceComputeCapability().仅在SM 1.3和更高版本的硬件上支持双精度。我有一个计算能力为3.0的GeForce GTX 680。它应该支持双精度计算。