我正在尝试规范化向量,但我的代码返回失败?

-2 c++ visual-studio-2013

下面是我的代码示例,尝试规范化我的3点向量{5,5,5}然而它在运行时打印"Normalize - Failed",可能有人解释为什么它没有成功对我这样我可能会尝试修复它?

#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;
    }
}
Run Code Online (Sandbox Code Playgroud)

San*_*ker 7

您的代码打印的原因"Failed"是因为您正在float使用完全比较值==.浮点数据类型通常不会精确地存储值,而是以一定的精度存储它们.此外,它们会受到舍入误差的影响,进一步加剧了您对值执行的计算.

阅读这篇关于"为什么我的浮点比较不起作用?"的 C++ FAQ条目.为了一个很好的解释.

你有一个选择,就是使用epsilon进行比较:

float epsilon = 0.0001; // or whatever accuracy you require
if (fabs(_fNormliseTestX - _fresultXMag) < epsilon) {
    // _fNormliseTestX and _fresultXMag are considered equal
}
Run Code Online (Sandbox Code Playgroud)