作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
isnan(), isinf()
直到 C99 才出现在规范中,无论如何在 C89 中实现这样的功能?
我可以用 if (d * 0 != 0)
检查 d 是 NaN 还是 Inf,但我们总是使用选项 -Werror=float-equal
编译我们的项目哪想喊出来:error: no == or != on float point value
那么人们如何在 C89 中检查 nan 和 inf 呢?
最佳答案
自 C99 isinf(x)
和 isnan(x)
处理 x
的实数 float 类型并且对于其他类型如 int
未定义. isinf(x)
和 isnan(x)
是宏。isinf(x)
和 isnan(x)
对 float, double, long double
使用相同的名称所以就像一个重载的函数。
isinf
对于 C89,我们可以使用单独的函数来测试 _MAX
.请注意,C89 没有定义 long double
.
“自己动手”isinf()
可以使用下面的。
#include <float.h>
int isinf_f(float x) { return x < -FLT_MAX || x > FLT_MAX; }
int isinf_d(double x) { return x < -DBL_MAX || x > DBL_MAX; }
isnan()
比较棘手。可以在下面作为函数或简单的宏来完成。功能依赖于现代的 Not-a-number 行为,其中 Nan 永远不等于任何东西,甚至不等于它本身。未由 C89 指定,但通常底层浮点系统遵循此。否则,您需要更特定于平台的方法。
/* Note `x` used twice here - so use with caution */
#define my_is_nan(x) ( (x) != (x) )
int isnan_f(float x) { x != x; }
int isnan_d(double x) { x != x; }
FLT_EVAL_METHOD
所以
1.0f / 7.0f
可能会使用
double
.这让事情有点复杂,但使用真正的函数确实会强制
x
表达式转换为所需的类型。
关于c - 人们如何在 C89 中检查 nan 和 inf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59797359/
我是一名优秀的程序员,十分优秀!