C++中检查浮点数值有效性

2021-02-10 12:03:51 浏览数 (1)

参考链接: C copysign()

今天在项目中检查到一个bug,程序会在某些情况下崩溃,最终认定是计算一个比值时,被除数和除数均为零,导致计算结果是个无效值,在后面的代码将使用这个无效值时导致了崩溃。需要对这个结果是否有效进行判断。 

下面列出 IEEE 推荐的对浮点型的常用函数,包括特殊值(无穷、无效)的判断: 

/* These are also declared in Mingw float.h; needed here as well to work 

   around GCC build issues.  */

/* BEGIN FLOAT.H COPY */

/*

 * IEEE recommended functions

 */

#ifndef _SIGN_DEFINED

#define _SIGN_DEFINED

  _CRTIMP double __cdecl _chgsign (double _X);

  _CRTIMP double __cdecl _copysign (double _Number,double _Sign);

  _CRTIMP double __cdecl _logb (double);

  _CRTIMP double __cdecl _nextafter (double, double);

  _CRTIMP double __cdecl _scalb (double, long);

  _CRTIMP int __cdecl _finite (double);

  _CRTIMP int __cdecl _fpclass (double);

  _CRTIMP int __cdecl _isnan (double);

#endif_chgsign (double _X)  返回一个与 _X 符号相反数值相同的数(正变为负,负变为正); 

_copysign (double _Number,double _Sign) 返回一个与 _Sign 符号相同,与 _Number 数值相同的数; 

_logb (double) 求输入数是2的多少次幂,返回值对确切结果向0取整; 

_nextafter (double x , double y) 输出x对y方向在double精度上的下一个值;  

_scalb (double x, long i) 输出x乘以2的i次幂的结果; 

_finite (double) 检查输入是否有效,若为 INT 或 NaN 则返回0,有效数值返回1; 

_fpclass (double) 返回一个浮点数的分类,详见:https://technet.microsoft.com/zh-cn/library/39s1cck2.aspx/ 

_isnan (double) 返回输入是否为 NaN。

0 人点赞