如果出现错误,我有一个可以返回nan或inf的数值方法,并且为了测试目的,我想暂时强制它返回nan或inf以确保正确处理情况.是否有一种可靠的,独立于编译器的方法来在C中创建nan和inf的值?
谷歌搜索大约10分钟后,我只能找到编译器相关的解决方案.
Alo*_*hal 79
您可以测试您的实现是否具有它:
#include <math.h>
#ifdef NAN
/* NAN is supported */
#endif
#ifdef INFINITY
/* INFINITY is supported */
#endif
Run Code Online (Sandbox Code Playgroud)
存在INFINITY
由C99(或至少是最新的草稿)保证,并且"扩展为表示正或无符号无穷大的float类型的常量表达式,如果可用;否则为float类型的正常量,在转换时溢出."
NAN
可以定义,也可以不定义,并且"当且仅当实现支持float类型的安静NaN时才定义.它扩展为float类型的常量表达式,表示安静的NaN."
请注意,如果您要比较浮点值,请执行以下操作:
a = NAN;
Run Code Online (Sandbox Code Playgroud)
即使这样,
a == NAN;
Run Code Online (Sandbox Code Playgroud)
是假的.检查NaN的一种方法是:
#include <math.h>
if (isnan(a)) { ... }
Run Code Online (Sandbox Code Playgroud)
您还可以:a != a
测试是否a
为NaN.
还有isfinite()
,isinf()
,isnormal()
,和signbit()
中宏math.h
在C99.
C99还具有以下nan
功能:
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
Run Code Online (Sandbox Code Playgroud)
(参考:n1256).
小智 34
没有编译器独立的方法,因为C(也不是C++)标准都没有说浮点数学类型必须支持NAN或INF.
编辑:我刚检查了C++标准的措辞,它说这些函数(模板类numeric_limits的成员):
quiet_NaN()
signalling_NaN()
Run Code Online (Sandbox Code Playgroud)
wiill返回NAN表示"如果可用".它没有扩展"如果可用"意味着什么,但可能是"如果实现的FP代表支持它们".同样,有一个功能:
infinity()
Run Code Online (Sandbox Code Playgroud)
返回正的INF代表"如果可用".
这些都在<limits>
标题中定义- 我猜测C标准有类似的东西(可能也"如果可用"),但我没有当前C99标准的副本.
Aar*_*ron 20
一种独立于编译器的方式,但不是处理器独立的方式来获取这些
int inf = 0x7F800000;
return *(float*)&inf;
int nan = 0x7F800001;
return *(float*)&nan;
Run Code Online (Sandbox Code Playgroud)
这适用于任何使用IEEE 754浮点格式(x86都支持)的处理器.
更新:经过测试和更新.
Tho*_* S. 20
这适用于float
和double
:
double NAN = 0.0/0.0;
double POS_INF = 1.0 /0.0;
double NEG_INF = -1.0/0.0;
Run Code Online (Sandbox Code Playgroud)
编辑:正如有人已经说过的那样,旧的IEEE标准说这些值应该会引发陷阱.但是新的编译器几乎总是关闭陷阱并返回给定的值,因为陷阱会干扰错误处理.
J.K*_*eck 12
double a_nan = strtod("NaN", NULL);
double a_inf = strtod("Inf", NULL);
Run Code Online (Sandbox Code Playgroud)