直到C99为止isnan(), isinf()才在规范中,是否在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的实数浮点型,而对于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; }

请注意,C不需要实现支持无穷大。如果是这样,则上述情况永远都是不正确的。

isnan

C89 isnan()的“自己动手”比较棘手。可以在下面作为函数或简单的宏来完成。功能依赖于现代的非数字行为,即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; }

请注意,C不需要实现支持非数字。如果是这样,则上述情况永远都是不正确的。

鉴于C89狂野的西部时代,我将不承担IEEE 754的合规性。 Infinity和NAN正是缺少正式合规性的任何浮点实现的边缘。祝你好运。

C允许根据FLT_EVAL_METHOD使用FP范围更广的数学运算,因此1.0f / 7.0f可以使用double。这使事情有些复杂,但是使用true函数会将x表达式强制转换为所需的类型。

关于c - 人们如何在C89中检查nan和inf,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59797359/

10-11 00:19