2011-12-14 30 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,但類似的事情可能會發生。

相關問題