如果出现错误,我有一个数值方法可以返回NaN或Inf,出于测试目的,我想临时强制它返回NaN或Inf,以确保正确处理这种情况.有没有一种可靠的、compiler-independent的方法来创建C语言中的NaN和inf的值?

在谷歌搜索了大约10分钟后,我只能找到依赖于编译器的解决方案.

推荐答案

您可以测试您的实现是否有:

#include <math.h>
#ifdef NAN
/* NAN is supported */
#endif
#ifdef INFINITY
/* INFINITY is supported */
#endif

C99(或至少是最新的草案)保证了INFINITY的存在,并"扩展为浮点型的常量表达式,表示正或无符号"

NAN可以定义,也可以不定义,"当且仅当实现支持浮点类型的安静NaN时才定义.它扩展为表示安静NaN的浮点类型的常量表达式."

请注意,如果要比较浮点值,请执行以下操作:

a = NAN;

即便如此,

a == NAN;

这是错误的.判断NaN的一种方法是:

#include <math.h>
if (isnan(a)) { ... }

你也可以做:a != a来测试a是否为NaN.

C99的math.h中还有isfinite()isinf()isnormal()signbit()个宏.

C99还有nan种功能:

#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);

(档号:N1256)

Docs INFINITY

C++相关问答推荐

如何在C中通过转换为char * 来访问float的字节表示?

strftime函数中%s的历史意义是什么?为什么没有记录?

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

C:scanf(%d&q;,...)输入只有一个减号

为什么内核使用扩展到前后相同的宏定义?

在C23中使用_GENERIC实现带有右值的IS_POINTER(P)?

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

C在声明带有值的数组时,声明大小有用吗?

如果dim指定数组中的数据量,使用dim-1会不会潜在地导致丢失一个元素?

&;(str[i])和(&;str)[i]有什么区别?

获取前2个连续1比特的索引的有效方法

For循环不会迭代所有字符串字符吗?(初学者问题)

我可以创建适用于不同endian的 colored颜色 struct 吗?

如何逐位读取二进制文件?

表达式x&;&;(~x)应该返回1还是0?它依赖于编译器吗?

在C中使用无符号整数模拟有符号整数

';malloc():损坏的顶部大小';分配超过20万整数后

不兼容的整数到指针转换传递';char';到类型';常量字符*

x86-64平台上的int_fast8_t大小与int_fast16_t大小

为什么 C 字符串并不总是等同于字符数组?