1

NaN 値を持つ浮動小数点変数を C++ で作成する必要があります。また、どの NaN がより大きな値を持つかを確認できるようにする必要もあります。NaN を比較するには、float の仮数部分を確認する必要があります。標準を使用して NaN を作成する

nanf("abc"); 

メソッドは、nanf 関数で異なる文字列が使用されていても、仮数部が同じ NaN になります。ビット パターンの基本部分から NaN を作成することにより、異なる仮数が提供されることが証明されるはずです。したがって、仮数のサイズで単純な並べ替えを実行できます。

4

2 に答える 2

1

frexp()関数のファミリと を見てくださいldexp()。これは一種の反対ですfrexp()

リンク: http://www.cplusplus.com/reference/cmath/ldexp/

于 2016-02-07T17:37:46.257 に答える
0

以下は、共用体と整数ビットフィールドを使用した型パニング浮動小数点値の例です。

#include <iostream>

union floatPun {
    struct {
        unsigned int mantissa : 23;
        unsigned int exponent : 8;
        unsigned int sign     : 1;
    };
    float value;
};

union doublePun {
    struct {
        unsigned long long mantissa : 52;
        unsigned long long exponent : 11;
        unsigned long long sign     : 1;
    };
    float value;
};

template <typename PunT>
static int compare_mantissas(const PunT& a, const PunT& b) {
    return int(a.mantissa > b.mantissa) - (b.mantissa > a.mantissa);
}

int main() {
    floatPun fa = {0}, fb = {0};

    // make NaNs
    fa.exponent = fb.exponent = 0xff;
    fa.mantissa = 1;
    fb.mantissa = 2;
    std::cout << "fa: " << fa.value << "   fb: " << fb.value << "\n";

    // compare mantissas
    static const char* const cmp_labels[] = {"less than", "equal to", "greater than"}; 
    std::cout << "mantissa of fa is " 
        << cmp_labels[1 + compare_mantissas(fa, fb)]
        << " mantissa of fb\n";

    // change fa to +infinity
    fa.mantissa = 0;
    std::cout << "changed fa's mantissa to zero: " << fa.value << "\n";
}
于 2016-02-07T23:49:29.530 に答える