c++ - 浮点值变化。不知道为什么

标签 c++ floating-point cuda 32bit-64bit

我有两个文件。

  • 树搜索.cpp
  • TreeSearchCUDA.cu

在 TreeSearch.cpp 中我有:

int* searchTree(vector<TreeNode> &tree, vector<ImageFeature> featureList)
{
    float** features = makeMatrix(featureList, CHILDREN);
    float* featuresArray = makeArray(features, featureList.size());
    float* centroidNodes = convertTree(tree);

    int numFeatures = featureList.size();
    for(int j = 0; j < 10; j++)
    {
        cout << "C++ " << centroidNodes[j] << endl;
    }
    cout << "" << endl;

    int* votes = startSearch(centroidNodes, tree.size(), featuresArray, numFeatures);

    return votes;
}

startSearch 存在于 TreeSearchCUDA.cu 中,如下所示:

int* startSearch(float* centroids, int nodesCount, float* features, int featuresCount)
{
    for(int j = 0; j < 10; j++)
    {
        printf("CUDA %f \n", centroids[j]);
    }
    ...
}

现在,如果我们查看输出,它看起来像这样:

C++ 0
C++ 2.52435e-29
C++ 0
C++ 2.52435e-29
C++ 6.72623e-44
C++ 1.26117e-44
C++ 2.03982e+12
C++ 4.58477e-41
C++ 0
C++ 1.26117e-44

CUDA 0.000000 
CUDA 0.000000 
CUDA 0.000000 
CUDA 0.000000 
CUDA 0.000000 
CUDA 0.000000 
CUDA 2039820058624.000000 
CUDA 0.000000 
CUDA 0.000000 
CUDA 0.000000 

结果不一样。有人有什么想法吗? :) 我有一个想法,这是因为代码的某些部分是用 -m64 编译的,而某些部分不是。然而,这是不可能改变的。链接对象时,我使用 -m64。

我希望有人有解决方案或解释:)

最佳答案

从您的输出看来,CUDA 正在将非常小的 float 近似为 0。除了 2.03982e+12 之外,您的所有输入都是非常小的 float 或 02.03982e+12 在输出中保持不变。您的质心应该很小吗?

关于c++ - 浮点值变化。不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8499965/

相关文章:

c - 浮点乘法与重复加法

linux - 内核更新破坏了 CUDA

java - 在JCUDA中执行cuCtxSynchronize()时出现"CUDA_ERROR_ILLEGAL_ADDRESS"

c++ - 自由字体轮廓重建不匹配字体

c++ - 通过 printf 函数打印带有 %u 说明符的 unsigned char 是否安全?

c++ - 类模板方法特化

javascript - MongoDB浮点值精度?

Python 字符串格式化 - 为同一个参数组合命名占位符和浮点格式化程序?

c++ - 我可以从不是由 nvcc 编译的 C++ 代码调用 CUDA 运行时函数吗?

c++ - 如何将函数指针传递给C++成员函数?