NaN 值的符号检查

发布于 2024-12-25 17:24:38 字数 244 浏览 2 评论 0原文

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

我还必须区分 nan 值是正数还是负数(nan-nan)。我该怎么做?

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

My program during calculation can generate nan or -nan values.
I check if the values are nan/-nan using isnan method.

I also have to distinguish if the nan value is positive or negative (nan or -nan). How can I do this?

Added:I need crossplatform solution for WIN and for Unix/Linux

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

冷血 2025-01-01 17:24:38

尝试 中的 signbit

描述

signbit() 是一个通用宏,可以作用于所有实数浮点
类型。如果 x 的值有符号位,则返回一个非零值
设置。

...

NaN 和无穷大有一个符号位。

它显然是 C99 和 POSIX.1-2001 的一部分,但如果您不想使用/符合,您可以自己编写一个宏/函数两者之一。

Try signbit from <math.h>:

Description

signbit() is a generic macro which can work on all real floating-point
types. It returns a nonzero value if the value of x has its sign bit
set.

...

NaNs and infinities have a sign bit.

It's apparently part of C99 and POSIX.1-2001, but you could write a macro/function yourself if you don't want to use/conform to either of the two.

旧人 2025-01-01 17:24:38

如今几乎所有系统都使用 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
}

Nearly all systems today use either IEEE single or double precision floating-point. So in that case you could (bitwise) convert it to an integer and read the sign-bit.

Here's one approach that uses unions. Although it's not fully standard-compliant, it should still work on nearly all systems.

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
}
紫罗兰の梦幻 2025-01-01 17:24:38

您可以使用 copysign 函数(C99,在 中);

double sign = copysign(1.0, your_nan);

来自 C99 §7.12.11.1:

描述

copysign 函数生成一个具有 x 大小和 y 符号的值。
如果 x 是 NaN,它们会生成 NaN(符号为 y)。关于实现
表示有符号零,但在算术中不能一致地处理负零
操作时,copysign 函数将零符号视为正数。

返回

copysign 函数返回一个具有 x 大小和 y 符号的值。

You could use the copysign function (C99, in <math.h>);

double sign = copysign(1.0, your_nan);

From C99 §7.12.11.1:

Description

The copysign functions produce a value with the magnitude of x and the sign of y.
They produce a NaN (with the sign of y) if x is a NaN. On implementations that
represent a signed zero but do not treat negative zero consistently in arithmetic
operations, the copysign functions regard the sign of zero as positive.

Returns

The copysign functions return a value with the magnitude of x and the sign of y.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文