我在计算过程中的程序可以生成nan
或-nan
值。
我使用nan
方法检查值是-nan
/ isnan
。
我还必须区分纳米值是正值还是负值(nan
或-nan
)。我怎么能这样做?
补充:我需要WIN和Unix / Linux的跨平台解决方案
答案 0 :(得分:5)
从signbit
尝试<math.h>
:
<强>描述强>
signbit()是一个通用的宏,可以处理所有真正的浮点数 类型。如果x的值具有其符号位,则返回非零值 集。
...
NaNs和无穷大有一个符号位。
它显然是C99和POSIX.1-2001的一部分,但如果您不想使用/符合这两者中的任何一个,您可以自己编写一个宏/函数。
答案 1 :(得分:2)
现在几乎所有系统都使用IEEE单精度或双精度浮点数。因此,在这种情况下,您可以(按位)将其转换为整数并读取符号位。
这是一种使用工会的方法。虽然它不完全符合标准,但它仍然适用于几乎所有系统。
union{
double f;
uint64_t i;
} x;
x.f = ... // Your floating-point value (can be NaN)
// Check the sign bit.
if ((x.i & 0x8000000000000000ull) == 0){
// positive
}else{
// negative
}
答案 2 :(得分:1)
您可以使用copysign
功能(C99,<math.h>
);
double sign = copysign(1.0, your_nan);
来自C99§7.12.11.1:
描述
copysign函数产生一个大小为x和y符号的值。 如果x是NaN,它们产生NaN(符号为y)。在实现上 表示有符号的零但不在算术中一致地处理负零 操作,复制功能将零的符号视为正面。
返回
copysign函数返回一个大小为x和y符号的值。