0

良い一日、

Microsoft Visual C++ 2008 Express Edition を使用して、プロジェクトをリリース モードでビルドしました。ただし、ここにある浮動小数点値の一部は、デバッグ構成のものとは異なります。なんらかの理由で、特定の機能についてはすべて NaN またはゼロであることが判明しています。なぜこれが起こっているのかわかりません。リリースモードでビルドするのはこれが初めてです。助けていただければ幸いです。

試行された手順:

  • 浮動小数点コマンド ライン オプション。

  • コードをステップ実行すると、いくつかの理由でこれが機能しませんでした。

  • コードを見つめる時間 読んでくれてありがとう!

これが不正なコードです(注:過去にこの特定の機能でNaNに問題がありましたが、これは奇妙です):

    /*
This file is part of White - Storm: Lightning (alpha).

    Copyright 2012 Christopher Augustus Greeley

    White - Storm: Lightning (alpha) is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    White - Storm: Lightning (alpha) is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with White - Storm: Lightning (alpha).  If not, see <http://www.gnu.org/licenses/>.
*/
#include "Vector Calculator.h"
WSL::Math::Vector::VectorCalculator::VectorCalculator()
{
    WSL::Containers::Base::XYZ temp;
    default_ = temp;
}
WSL::Containers::Base::XYZ WSL::Math::Vector::VectorCalculator::VectorCalculation( WSL::Containers::Base::XYZ goTo, WSL::Containers::Base::XYZ position, float speed, bool td )
{
    //Make sure that the vector doesent have any stray values lying around.//
    vector = default_;
    //Calculate Magnitude.//
    x = goTo.getX() - position.getX();
    y = goTo.getY() - position.getY();
    z = goTo.getZ() - position.getZ();
    if( td == true )
        magnitude = magn.DotProduct( x, y, z, magnitude );
    else
        magnitude = magn.DotProduct( x, y, magnitude );
    if( x == 0 && y == 0 && z == 0 )
        return vector;
    //Normilise//
    magnitude = sqrt( magnitude );
    //Make sure we do not divide by zero.//
    if( magnitude != 0 )
    {
        if( x != 0 )
            x /= magnitude;
        if( y != 0 )    
            y /= magnitude;
        if( td == true )
            if( z != 0 )
                z /= magnitude;
    }
    //Go The Desired Speed.//
    if( speed >=0 )
    {
        x *= speed;
        y *= speed;
    }
    if( td == true )
        z *= speed;
    vector.setX( x );
    vector.setY( y );
    vector.setZ( z );
    return vector;
}
inline float WSL::Math::Formulas::Dot::DotProduct( float x, float y, float mag )
{
    return ( mag = ( ( x ) * ( x ) + ( y ) * ( y ) ) );
}
inline float WSL::Math::Formulas::Dot::DotProduct( float x, float y, float z, float mag )
{
    return ( mag = ( ( x ) * ( x ) + ( y ) * ( y ) + ( z ) * ( z ) ) );
}

ヘッダ:

    /*
This file is part of White - Storm: Lightning (alpha).

    Copyright 2012 Christopher Augustus Greeley

    White - Storm: Lightning (alpha) is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    White - Storm: Lightning (alpha) is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with White - Storm: Lightning (alpha).  If not, see <http://www.gnu.org/licenses/>.
*/
#include "Int Bool.h"
namespace WSL
{
    namespace Math
    {
        namespace Formulas
        {
            class Dot
            {
            public:
                inline float DotProduct( float x, float y, float mag );
                inline float DotProduct( float x, float y, float z, float mag );
            };
        }
        namespace Vector
        {
            struct VectorCalculator
            {
                VectorCalculator();
                WSL::Containers::Base::XYZ VectorCalculation( WSL::Containers::Base::XYZ goTo, WSL::Containers::Base::XYZ position, float speed, bool td );
                WSL::Containers::Base::XYZ VectorCalculation( WSL::Containers::Base::XYZ goTo, WSL::Containers::Base::XYZ *position, float speed, bool td );
                private:
                    WSL::Containers::Base::XYZ vector;
                    WSL::Containers::Base::XYZ default_;
                    float x, y, z, magnitude;
                    Math::Formulas::Dot magn;
            };
        }
    }
}

コンテキスト:

/*
This file is part of White - Storm: Lightning (alpha).

    Copyright 2012 Christopher Augustus Greeley

    White - Storm: Lightning (alpha) is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    White - Storm: Lightning (alpha) is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with White - Storm: Lightning (alpha).  If not, see <http://www.gnu.org/licenses/>.
*/
#include "Include.h"
namespace WSL
{
    namespace Containers
    {
        namespace Base
        {
            struct XYZB
            {
                inline float getX() { return X; }
                inline float getY() { return Y; }
                inline float getZ() { return Z; }
                inline void setX( float Value ) { X = Value; }
                inline void setY( float Value ) { Y = Value; }
                inline void setZ( float Value ) { Z = Value; }
                protected:
                    float X, Y, Z;
            };
            struct XYZ : public XYZB
            {
            public:
                XYZ( float x, float y, float z )
                {
                    X = x;
                    Y = y; 
                    Z = z;
                }
                inline XYZ() { X = 0; Y = 0; Z = 0; }
            };
        }
    }
}

次のファイルで問題が確認されました。

/*
This file is part of White - Storm: Lightning (alpha).

    Copyright 2012 Christopher Augustus Greeley

    White - Storm: Lightning (alpha) is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    White - Storm: Lightning (alpha) is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with White - Storm: Lightning (alpha).  If not, see <http://www.gnu.org/licenses/>.
*/
#include "Vector.h"
WSL::Containers::Math::Vector::Vector()
{
    destinationInitialize = false;
    threeDimentional = false;
}
WSL::Containers::Math::Vector::Vector( WSL::Containers::Base::XYZ position_ )
{
    position = position_;
    destinationInitialize = false;
    threeDimentional = false;
}
WSL::Containers::Math::Vector::Vector( WSL::Containers::Base::XYZ position_, bool threeDimentional_ )
{
    position = position_;
    destinationInitialize = false;
    threeDimentional = threeDimentional_;
}
float WSL::Containers::Math::Vector::GetDestinationX()
{
    return destination.getX();
}
float WSL::Containers::Math::Vector::GetDestinationY()
{
    return destination.getY();
}
float WSL::Containers::Math::Vector::GetDestinationZ()
{
    return destination.getZ();
}
WSL::Containers::Base::XYZ WSL::Containers::Math::Vector::GetDestination()
{
    return destination;
}
WSL::Containers::Base::XYZ WSL::Containers::Math::Vector::GetPosition()
{
    return position;
}
float WSL::Containers::Math::Vector::GetX()
{
    return position.getX();
}
float WSL::Containers::Math::Vector::GetY()
{
    return position.getY();
}
float WSL::Containers::Math::Vector::GetZ()
{
    return position.getZ();
}
void WSL::Containers::Math::Vector::SetThreeDimentional( bool value )
{
    threeDimentional = value;
}
bool WSL::Containers::Math::Vector::GetThreeDimentional()
{
    return threeDimentional;
}
void WSL::Containers::Math::Vector::CalculateVector()
{
    vector = vectorCalculator.VectorCalculation( destination, position, speed, threeDimentional );
}
void WSL::Containers::Math::Vector::Move()
{
    position.setX( position.getX() + vector.getX() );
    position.setY( position.getY() + vector.getY() );
    position.setZ( position.getZ() + vector.getZ() );
}
void WSL::Containers::Math::Vector::SetPosition( WSL::Containers::Base::XYZ position_ )
{
    position = position_;
}
void WSL::Containers::Math::Vector::SetSpeed( float speed_ )
{
    speed = speed_;
}
void WSL::Containers::Math::Vector::SetDestination( float x, float y )
{
    destination.setX( x );
    destination.setY( y );
    if( destinationInitialize == false )
    {
        destinationInitialize = true;
        destination.setZ( 0 );
    }
}
void WSL::Containers::Math::Vector::SetDestination( float x, float y, float z )
{
    destination.setX( x );
    destination.setY( y );
    destination.setZ( z );
}
void WSL::Containers::Math::Vector::SetDestination( WSL::Containers::Base::XYZ destination_ )
{
    destination = destination_;
}
void WSL::Containers::Math::Vector::SetDestination( float allCoords )
{
    destination.setX( allCoords );
    destination.setY( allCoords );
    destination.setZ( allCoords );
}
void WSL::Containers::Math::Vector::SetVector( WSL::Containers::Base::XYZ vector_ )
{
    vector = vector_;
}
WSL::Containers::Base::XYZ WSL::Containers::Math::Vector::GetVector()
{
    return vector;
}
float WSL::Containers::Math::Vector::GetSpeed()
{
    return speed;
}

ヘッダ:

/*
This file is part of White - Storm: Lightning (alpha).

    Copyright 2012 Christopher Augustus Greeley

    White - Storm: Lightning (alpha) is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    White - Storm: Lightning (alpha) is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with White - Storm: Lightning (alpha).  If not, see <http://www.gnu.org/licenses/>.
*/
#include "Engine.h"
namespace WSL
{
    namespace Containers
    {
        namespace Math
        {
            class Vector
            {
                WSL::Math::Vector::VectorCalculator vectorCalculator;
                WSL::Containers::Base::XYZ position;
                WSL::Containers::Base::XYZ destination;
                WSL::Containers::Base::XYZ vector;
                bool destinationInitialize, threeDimentional;
                float speed;
            public:
                Vector();
                Vector( WSL::Containers::Base::XYZ position_ );
                Vector( WSL::Containers::Base::XYZ position_, bool threeDimentional_ );
                void CalculateVector();
                bool GetThreeDimentional();
                void Move();
                void SetPosition( WSL::Containers::Base::XYZ position_ );
                void SetDestination( float x, float y );
                void SetDestination( float x, float y, float z );
                void SetDestination( WSL::Containers::Base::XYZ destination_ );
                void SetDestination( float allCoords );
                void SetSpeed( float speed_ );
                void SetThreeDimentional( bool value );
                void SetVector( WSL::Containers::Base::XYZ vector_ );
                float GetDestinationX();
                float GetDestinationY();
                float GetDestinationZ();
                WSL::Containers::Base::XYZ GetDestination();
                WSL::Containers::Base::XYZ GetPosition();
                WSL::Containers::Base::XYZ GetVector();
                float GetX();
                float GetY();
                float GetZ();
                float GetSpeed();
            };
        }
    }
}
4

1 に答える 1

1

わかった。コメントに書いたように、あなたの問題に対する答えはわかりませんが、問題を見つけるのに役立つかもしれないいくつかの指針を提供できるかもしれません.

私の最初の提案は、コードを lua コンテキストから取り出し、それをデバッグするための小さな単体テストを作成することです。リリース モードの単体テストでエラーが発生しない場合、問題は別の場所にあります。それでもエラーが発生する場合は、コードにバグがあるかどうかを確認できる可能性があります。コードにバグがないと確信している場合は、ここにいくつかのポインタがあります

私の経験では、NaN、Zero、または INF が予期されず、入力または計算に問題がない場合、あなたまたは使用するライブラリのいずれかが何らかの方法で浮動小数点フラグを変更するかどうかを確認することをお勧めします ( Windows では controlfp または control87 を使用し、GCC では FPU_SETCW FPU_GETCW マクロを使用します) また、浮動小数点計算の実行方法を変更するコンパイル フラグの不一致も、このような問題を引き起こす可能性があります。すべてのライブラリが同じ浮動小数点フラグを使用してコンパイルされていることを確認してください。

mag がゼロでないことを確認する方法を変更することもできます。ゼロに近い浮動小数点値では、常に問題が発生する可能性があります。フロートの比較に関する Bruce Dawson の記事をご存じない場合は、最新バージョンへのリンクをご覧ください: http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

これで何も解決しない場合は、おそらく LUA から不正な番号を渡している可能性があります。

于 2012-10-15T09:24:05.973 に答える