FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C++の浮動少数値0の符号の特性について

ちょっとしたことなのですが、C++の浮動少数値のゼロの値の特性についてまとめてみました。


・0と-0はストリーム出力は異なるが同値として扱われる
#define D(val) (double)val

double zero_a = D(0);
double zero_b = -D(0);

cout << zero_a << endl;
cout << zero_b << endl;
cout << ((zero_a == zero_b) ? "T" : "F") << endl;

出力結果:
0
-0
T


・ゼロに負数をかけると-0になる
#define D(val) (double)val

double zero = D(0);
cout << zero << endl;

zero *= -1;
cout << zero << endl;

出力結果:
0
-0


・-0に0を加算すると符号がリセットされる
#define D(val) (double)val

double zero_a = D(0);
double zero_b = -D(0);
cout << zero_a << " " << zero_b << endl;

zero_a += D(0);
zero_b += D(0);
cout << zero_a << " " << zero_b << endl;

出力結果:
0 -0
0 0




・0の符号がマイナスになることが問題になる例

では、この挙動が具体的にどういった場合に問題になるのか、ということなのですが、たとえば、

    // なにかの高さを取得
    // 原点より下ならマイナスの値になる
    double h = GetHeight();

    // 上下と逆と判断する(=逆立ちしているような状態)
    if (IsReverse())
        h *= -1;

    cout << h << endl;


たとえば、こんな感じのコードがあった場合、GetHeight == 0の場合に、IsReverseがtrueでもfalseでも
理論上はどちらも同じ0が出力されてほしいのに、実際にはIsReverse==falseの場合に-0と表示されてしまいます。

そのような問題を防ぎたい場合に、値に += 0を行うと、値が0の場合に常に符号を表示しないようにすることができます。

    // なにかの高さを取得
    // 原点より下ならマイナスの値になる
    double h = GetHeight();

    // 上下と逆と判断する(=逆立ちしているような状態)
    if (IsReverse())
        h *= -1;

    h += 0;

    cout << h << endl;

スポンサーサイト

コメントの投稿

非公開コメント

カレンダー
09 | 2018/10 | 11
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
最新記事
カテゴリ
Qt (21)
SDL (2)
MFC (2)
検索フォーム
月別アーカイブ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
リンク(管理用)
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。