签名检查NaN值

时间:2012-01-08 20:37:20

标签: c visual-studio unix nan sign

我在计算过程中的程序可以生成nan-nan值。 我使用nan方法检查值是-nan / isnan

我还必须区分纳米值是正值还是负值(nan-nan)。我怎么能这样做?

补充:我需要WIN和Unix / Linux的跨平台解决方案

3 个答案:

答案 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符号的值。