1

次の組合を持つ:

union {double first_d; uint64 first;};
union {double second_d; uint64 second;};
...
first_d = <a double value>
second_d = <a double value>

次の比較の出力を行います:

if(first_d > second_d)
    // CASE 1 OUTPUT
else if(first_d < second_d)
    // CASE 2 OUTPUT
else
    // CASE 3 OUTPUT

次の場合も常に同じですか?

if(first> second)
    // CASE 1' OUTPUT
else if(first < second)
    // CASE 2' OUTPUT
else
    // CASE 3' OUTPUT
4

1 に答える 1

2

いいえ。これは、以下を使用した反例NaNsです。

int main()
{

    union {double first_d; uint64 first;};
    union {double second_d; uint64 second;};

    first  = 0x7ff8000000000001;
    second = 0x7ff8000000000002;

    if(first_d > second_d)
        printf("greater\n");
    else if(first_d < second_d)
        printf("less\n");
    else
        printf("other\n");

    if(first > second)
        printf("greater\n");
    else if(first < second)
        printf("less\n");
    else
        printf("other\n");

    return 0;
}

出力:

other
less

また、ユニオンを介した型のパンニングは100%標準に準拠しているわけではありません。したがって、それは未定義の動作であるとも言えます。

于 2012-09-16T21:42:46.087 に答える