【问题标题】:Creating a NaN float value from the sign, exponent and mantissa parts in C++从 C++ 中的符号、指数和尾数部分创建 NaN 浮点值
【发布时间】:2016-02-07 17:32:03
【问题描述】:

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

nanf("abc"); 

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

【问题讨论】:

标签: c++ sorting nan bitset mantissa


【解决方案1】:

看看frexp() 函数族以及ldexp(),这与frexp() 有点相反

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

【讨论】:

  • 不幸的是,您不能以这种方式生成 NaN。
【解决方案2】:

这是一个使用联合和整数位域对浮点值进行类型双关的示例。

#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";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-19
    • 2018-01-12
    • 2018-09-23
    • 2015-07-20
    • 1970-01-01
    • 2019-04-16
    • 2012-03-09
    • 2020-12-20
    相关资源
    最近更新 更多