C语言 使用-Wfloat-equal?时检查无穷大

x7yiwoj4  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(149)

我喜欢的项目使用-nostdlib,所以我不能使用任何C库,但我可以包括他们的常数。
下面是我的代码。如果我在gcc或clang上使用gcc -Wfloat-equal -nostdlib -O2 -c a.c编译,它会给予我下面的错误。我很好奇是否有一种方法可以检查而不触发这个警告。我怀疑我不能,除非我调用我不编译的代码
警告:将浮点数与“==”或“!=”进行比较是不安全的[-Wfloat-equal]

#include <math.h>
int IsInfinity(double d) {
    return d != (double)INFINITY && (float)d == INFINITY;
}
hkmswyz6

hkmswyz61#

您可以使用return d < INFINITY && (float) d >= INFINITY;
如果您要对称地分类负值,另一个选项是return isfinite(d) && isinf((float) d);。(这些是在math.h中定义的宏。)

mnowg1ta

mnowg1ta2#

代码看起来像是在尝试测试d是否在有限范围内,以及作为float是否大于FLT_MAX

// OP's
int IsInfinity(double d) {
  return d != (double)INFINITY && (float)d == INFINITY;
}

是否有办法在不触发警告的情况下进行检查。
候补:
通过最大值检查:

int IsInfinity_alt(double d) {
  if (d < 0) d = -d;  // OP can not use fabs().
  return ((float)d > FLT_MAX && d <= DBL_MAX);
}

有代码使用了下面的一些double,只是比FLT_MAX函数大,与上面的不同。这种行为可能是OP首选的。

return (d > FLT_MAX && d <= DBL_MAX);

相关问题