我需要在C ++中创建一个具有NaN值的浮点变量。我还需要能够看到哪个NaN具有更大的值。要比较NaN,您需要查看浮点数的尾数部分。 使用标准
创建NaNnanf("abc");
方法导致NaN具有相同的尾数,即使在nanf函数中使用不同的字符串也是如此。通过从位模式的基本部分创建NaN应证明提供不同的尾数,因此可以对尾数的大小执行简单的排序。
答案 0 :(得分:1)
查看frexp()
系列函数以及ldexp()
,它与frexp()
答案 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";
}