第13章浮点编程(www.cppentry.com)中的常见技巧
本章的代码,有的需要x87 FPU支持,有的需要VC6 CRT支持,有的只需要运行环境满足IEEE 754标准即可,有的只要是支持浮点类型的C开发环境即可。它们的可读性和效率差别较大,使用时需要根据情形选择。
13.1 输入与中间结果检测
虽然在数据运算中,最常见的输入是-∞和+∞之间的有限数,但在实际运算中可能出现的输入和可能的返回值均不止有限数。而且,对于函数而言,还有一种可能就是输入值超出了函数定义域。当这些情形出现时需要特别处理,可以达成下列效果:
(1)代码稳定。在异常情形下也能正常运行。
(2)提高效率。某些函数在这些特殊殊点的值已知,直接返回即可,无需继续计算。
(3)满足IEEE标准。IEEE对浮点运算作了一些约定,例如如何处理非法运算等,代码应该遵循这些约定。
IEEE标准中也建议实现一组函数实现浮点数的基本操作,例如VC6浮点库中的_fpclass()就是IEEE建议的浮点数分类函数,类似的函数还有_isnan()和_finite()等。利用这些函数可以有效地检测函数的输入和中间运算结果。
13.1.1 输入检测
例如在General工程的log()中有输入检测代码:
- switch(_fpclass(x))
- {
-
- case _FPCLASS_SNAN:
- case _FPCLASS_QNAN:
- case _FPCLASS_NINF:
- case _FPCLASS_PINF:
- case _FPCLASS_ND:
- case _FPCLASS_NN:
- {
- rv = nan(0, 0);
- _copysign(rv, x);
- }
- return rv;
-
-
- case _FPCLASS_NZ:
- case _FPCLASS_PZ:
- return infinite( 1 );
-
-
- default:
- break;
- }
【责任编辑:
董书 TEL:(010)68476606】