参考链接: 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。