从C ++中的符号,指数和尾数部分创建NaN浮点值

时间:2016-02-07 17:32:04

标签: c++ sorting nan bitset mantissa

我需要在C ++中创建一个具有NaN值的浮点变量。我还需要能够看到哪个NaN具有更大的值。要比较NaN,您需要查看浮点数的尾数部分。 使用标准

创建NaN
nanf("abc"); 

方法导致NaN具有相同的尾数,即使在nanf函数中使用不同的字符串也是如此。通过从位模式的基本部分创建NaN应证明提供不同的尾数,因此可以对尾数的大小执行简单的排序。

2 个答案:

答案 0 :(得分:1)

查看frexp()系列函数以及ldexp(),它与frexp()

相反

链接:http://www.cplusplus.com/reference/cmath/ldexp/

答案 1 :(得分: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";
}