2015-11-04 24 views
-2

下面是我的代码示例,试图规范我的3点向量{5,5,5} 然而它运行时打印“正常化 - 失败”,有人可能会解释为什么它没有成功这样对我,所以我可能试图解决它?我想正常化一个向量,但我的代码返回失败?

#include <iostream> 
#include "Geometry.h" 
#include <math.h> 

void Normalise() 
{ 
    TVector3 _krA;//vector/mag vector = answer x y z 
    { 
     _krA.m_fX = 5; 
     _krA.m_fY = 5; 
     _krA.m_fZ = 5; 
    } 
    TVector3 _rResultant; 
    { 
     _rResultant.m_fX = (_krA.m_fX * _krA.m_fX); 
     _rResultant.m_fY = (_krA.m_fY * _krA.m_fY); 
     _rResultant.m_fZ = (_krA.m_fZ * _krA.m_fZ); 
    } 
    float _fResultFinalMag = sqrt(_rResultant.m_fX + _rResultant.m_fY + _rResultant.m_fZ); 

    float _fresultXMag = (_krA.m_fX/_fResultFinalMag); 
    float _fresultYMag = (_krA.m_fY/_fResultFinalMag); 
    float _fresultZMag = (_krA.m_fZ/_fResultFinalMag); 

    float _fNormliseTestX = 0.577350; 
    float _fNormliseTestY = 0.577350; 
    float _fNormliseTestZ = 0.577350; 

    if (_fNormliseTestX == _fresultXMag && _fNormliseTestY == _fresultYMag && _fNormliseTestZ == _fresultZMag) 
    { 
     std::cout << "Normalise - Success" << std::endl; 
    } 
    else 
    { 
     std::cout << "Normalise - Failed" << std::endl; 
     std::cout << _fresultXMag << std::endl; 
     std::cout << _fresultYMag << std::endl; 
     std::cout << _fresultZMag << std::endl; 
     std::cout << _fResultFinalMag << std::endl; 
    } 
} 
+2

如果你想用一个编译错误帮助,请注明你得到确切的编译错误(S)。 –

+0

它运行良好,其实我不明白为什么代码返回失败 –

+2

顺便说一句,你可能不希望[用'=='比较float值](https://isocpp.org/ wiki/faq/newbie#floating-point-arith) –

回答

7

的原因,你的代码打印"Failed",是因为你正好使用==比较float值。浮点数据类型通常不会精确地存储值,而是以一定的精度存储它们。而且,它们受到舍入误差的影响,使得您执行的更多计算与值更加复杂。

请仔细阅读此C++ FAQ条目,以获取有关"Why doesn’t my floating-point comparison work?"的最佳解释。你有

一种选择,是使用小量比较:

float epsilon = 0.0001; // or whatever accuracy you require 
if (fabs(_fNormliseTestX - _fresultXMag) < epsilon) { 
    // _fNormliseTestX and _fresultXMag are considered equal 
} 
+0

啊谢谢你,我搜索了晶圆厂,并修改了我的代码,现在我对你的时间有了更好的理解。 –

相关问题