13.1.1 输入检测

2013-10-07 00:53:00 · 作者: · 浏览: 71

第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()中有输入检测代码:

  1. switch(_fpclass(x))  
  2. {  
  3. // 非法运算,返回QNaN,保留符号  
  4. case _FPCLASS_SNAN:         // ln(SNaN)  
  5. case _FPCLASS_QNAN:         // ln(QNaN)  
  6. case _FPCLASS_NINF:         // ln(-∞)  
  7. case _FPCLASS_PINF:         // ln(+∞)  
  8. case _FPCLASS_ND:           // ln(负弱规范数)  
  9. case _FPCLASS_NN:           // ln(负数)  
  10.     {  
  11.         rv = nan(0, 0);  
  12.         _copysign(rv, x);  
  13.     }  
  14.     return rv;  
  15.  
  16. // 输入是0时,无需级数计算,直接返回结果-∞  
  17. case _FPCLASS_NZ:  
  18. case _FPCLASS_PZ:  
  19.     return infinite( 1 );  
  20.  
  21. // 其他(有限正数和正弱规范数)参与级数运算  
  22. default:  
  23.     break;  

【责任编辑:董书 TEL:(010)68476606】

回书目   上一节   下一节