0

現在、データベースからデータを読み取る必要がある C++ コードに取り組んでおり、データベースの値がゼロでない場合は、さらにロジックを適用する必要があります。

しかし、データベースには計算中の値があり、-0.0. そして、この負のゼロは C++ double 変数のガベージ値として扱われています。0.0コンストラクターのように値を既に初期化しています。

サンプルコード:

for(Sample::List<BalanceSheet>::Iterator i((Sample::List<BalanceSheet> &) Balance.Entries()); i.HaveItem(); ++i) // This list is being populated from Database
{
    if (SomeCondition != "")
    {
        if (i->GetBalance() != 0) // This is where am getting Garbage values since GetBalance() returns -0.0
            {
             DoOperation();
            }
    }
}
4

2 に答える 2

2

-0.0は a に対して完全に有効な値ですdouble。あなたが抱えている問題は、二重の不等式を比較していることです。

あなたがすべきことは次のようなものです:

i->GetBalance() > std::numeric_limits<double>::epsilon()
于 2015-11-30T15:13:38.267 に答える
1

まず、浮動小数点変数を使用したり、浮動小数点変数を使用したりしないでください。浮動小数点型の制限により、一見無害に見える値でさえ同じように比較できない可能性があるため、これらは本質的に無意味な操作です。2 + 2 が 4 ではない可能性は、少なくともそれを特定する限りではあり得ます。==!===

ここでの本当の問題は、「ゼロ」値の符号を使用していることです。これは、上記のように、そもそも実際には正確にゼロではない可能性がありますが、さらに重要なことに、標準の比較演算子を使用してテストするのは困難です。議論については、この関連する質問を参照してください。

C++ 11またはそれをサポートするコンパイラにアクセスできる場合、これに対する最良の解決策は、copysignその質問に対するVladの回答に従って使用することです。この関数は 2 つのパラメーターを取ります。1 つ目は戻り値の大きさを表し、2 つ目は符号を表します。次に例を示します。

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

using namespace std;

int main()
{
    double posZero = +0.0d;
    double negZero = -0.0d;

    if( copysign( 1, posZero ) < 0 )
    {
        cout << "posZero is negative\n";
    }
    else
    {
        cout << "posZero is positive\n";
    }

    if( copysign( 1, negZero ) < 0 )
    {
        cout << "negZero is negative\n";
    }
    else
    {
        cout << "negZero is positive\n";
    }
}

posZero は正
です negZero は負です

この例でcopysignは、2 番目の引数の符号に従って、+/- 1 の値を作成します。目的の最初の引数は、ゼロ以外の任意の値にすることができますが、1 にすることもできます。

あるいは、おそらくより直接的なsignbitを使用することもできます。この関数を使用した上記のバージョン:

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

using namespace std;

int main()
{
    double posZero = +0.0d;
    double negZero = -0.0d;

    if( signbit( posZero ) )
    {
        cout << "posZero is negative\n";
    }
    else
    {
        cout << "posZero is positive\n";
    }

    if( signbit( negZero ) )
    {
        cout << "negZero is negative\n";
    }
    else
    {
        cout << "negZero is positive\n";
    }
}

同じ出力で。

于 2015-11-30T15:43:00.253 に答える