2011-12-14 40 views
0

我有两个文件。浮动值变化。不知道为什么

  • TreeSearch.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; 
} 

开始搜索存在于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]); 
    } 
    ... 
} 

现在我f我们看看它的输出如下:

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是接近真正的小浮0溶液或解释:)

+0

你能解释哪部分代码是用64bit编译的,哪部分是32bit的? – shibumi 2011-12-14 06:06:42

回答

2

它看起来像。所有的输入都是小浮点数或0,除了2.03982e+122.03982e+12在输出中保持不变。你的质心应该是真的很小?

+0

我很愚蠢。我没有注意到这一点。结果是一样的。如果我使用科学记数法,结果是正确的。 – 2011-12-14 06:11:46

1

float s不准确,您可以使用标头<limits>来获取有关可以安全使用的(十进制)浮点数以及保证保持不变的信息。

#include <limits> 

... 

std::cerr << std::numeric_limits<float>::digits10 << std::endl; 

在我的系统这个输出6,这意味着我可以肯定的是使用6个小数当浮子是准确的。但是,包含更多小数的数字并不被认为是确切的,numeric_limits<float>不能保证这些数字将保持不变并保持100%不变。

我可能会添加的另一件事是printf不会输出std::ostream这样的浮点数,因此处理和打印浮点的方式通常存在内部差异。我不认为printf%f作为默认的“信任”的科学表示std::ostream许多小数。


#include <limits> 
#include <iostream> 

int 
main (int argc, char *argv[]) 
{ 
    float x = 0.1234599999; // 10 digits 

    std::cout.precision (10); 
    std::cout << x << std::endl; 
} 

输出(在我的系统)

0.1234600022 
0

根据http://developer.download.nvidia.com/assets/cuda/files/NVIDIA-CUDA-Floating-Point.pdf,在 “设备与计算能力为1.2”[或1.3浮标],“非规格化数(接近小的数字零)被刷新为零。“非正规数字是〜1.4e-45和〜1.18e-38之间的数字(http://en.wikipedia.org/wiki/Single-precision_floating-point_format),所以这解释了你的e-41和e-44数字以0结束。我不确定电子29,但类似的事情可能会发生。

相关问题