直到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/