0

我有两个双打并且x已知是一个特定的 NaN 值,我想看看它们是否按位相同。也就是说,我想确定是否与 NaN 值完全相同。yyxy

NaN 不能与操作符进行有用的比较,==因为 NaN 永远不等于任何其他值(甚至不等于它们自己!)。

有没有比以下“按位相等”方法更好的方法(这种方法合法吗?):

bool bitwise_equal(double x, double y) {
    unsigned char xbytes[sizeof(x)];
    unsigned char ybytes[sizeof(y)];
    memcpy(xbytes, &x, sizeof(x));
    memcpy(ybytes, &y, sizeof(y));
    return memcmp(xbytes, ybytes, sizeof(x)) == 0;
}
4

1 回答 1

2

比较两个双打,看看它们是否相同 NaN

如果它们按位相同

我想确定 x 是否与 y 完全相同的 NaN 值。

直接比较位模式memcmp()是一种合理的方法。

C 没有详细说明 NaN 有效载荷的相同性。注意:一个实现可以用多个位模式定义“相同”。见标志注意事项。

#include <math.h>
#include <stdbool.h>
#include <string.h>

bool NaN_bitwise_equal(double x, double y) {
    return isnan(x) && isnan(y) && memcmp(&x, &y, sizeof x) == 0;
}

“相同的 NaN 值”有些矛盾,因为这些值在数值上不可比较,但 NaN 有效负载可能是。

于 2021-04-19T02:53:00.947 回答