设为首页 加入收藏

TOP

13.1.1 输入检测
2013-10-07 00:53:00 来源: 作者: 【 】 浏览:68
Tags:13.1.1 输入 检测

第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】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇13.1.2 中间结果检测 下一篇13.4.4 将表达式变形避免极值

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: