C++ 浮动值会发生变化。不知道为什么

C++ 浮动值会发生变化。不知道为什么,c++,floating-point,cuda,32bit-64bit,C++,Floating Point,Cuda,32bit 64bit,我有两个文件 TreeSearch.cpp TreeSearchCUDA.cu 在TreeSearch.cpp中,我有: int* searchTree(vector<TreeNode> &tree, vector<ImageFeature> featureList) { float** features = makeMatrix(featureList, CHILDREN); float* featuresArray = makeArray(

我有两个文件

  • 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;
}
结果不一样。有人有什么想法吗?:) 我认为这是因为代码的某些部分是用-m64编译的,而有些部分不是。然而,这是不可能改变的。链接对象时,我使用-m64


我希望有人能给出一个解决方案或解释:)

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

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

float
s不精确,你可以使用标题
来获取关于你可以安全使用的(十进制)float中有多少位数的信息,并且保证保持不变

 #include <limits>

 ...

 std::cerr << std::numeric_limits<float>::digits10 << std::endl;
输出(在我的系统上)


float
s不精确,您可以使用标题
获取有关(十进制)float中可以安全使用且保证保持不变的位数的信息

 #include <limits>

 ...

 std::cerr << std::numeric_limits<float>::digits10 << std::endl;
输出(在我的系统上)


根据,在“计算能力为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的。我不确定e-29的情况,但类似的情况也可能发生。

根据《计算能力为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的。我不确定e-29的版本,但类似的事情可能会发生。

你能解释一下代码的哪部分是用64位编译的,哪部分是用32位编译的吗?你能解释一下代码的哪部分是用64位编译的,哪部分是用32位编译的吗?我太笨了。我没有注意到这一点。结果是一样的。如果我用科学记数法,结果是正确的。我太笨了。我没有注意到这一点。结果是一样的。如果我使用科学记数法,结果是正确的。
 #include <limits>

 ...

 std::cerr << std::numeric_limits<float>::digits10 << std::endl;
#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