13.1.2 中间结果检测
理论上,最好每次运算或操作以后都进行检测以尽快发现异常。但这意味着几乎每条语句后面都跟随着检测代码,虽然稳定了,但效率太低,代码也太啰唆,一般没有必要。不过,在一些影响效率和稳定性的关键处添加检测代码还是必要的。
通常一个计算函数只完成一件相对简单的任务,但这件简单的任务往往也需要分几个阶段完成,例如输入检测阶段、预处理阶段、初始化阶段、循环阶段、规范输出阶段等。在从一个阶段进入另一个阶段时,可能有需要附加检测代码的关键之处。不过,如果函数比较简单(例如基本函数),每个阶段均比较简单,这类关键之处并不多。
对于级数计算或迭代代码而言,一个更常见的关键之处是循环。如果在循环中出现了差错(例如溢出或超出函数定义域),那么除了代码效率低(做了大量无需做的计算)之外,很可能因终止条件判断出现问题导致死循环。例如,下列代码:
- do{
- yn = yn1;
- sn = sin( yn );
- cn = cos( yn );
- yn1 = yn - ( sn - x*cn )/( cn + x*sn );
- }while( fabs( yn1 - yn ) >= PRECISION/2.0 );
如果yn1是NaN值,那么while语句中的终止条件将永远无法满足,程序进入死循环。加入中间结果检测代码是一种比较可靠的方法,针对上述代码有:
- do{
- yn = yn1;
- sn = sin( yn );
- cn = cos( yn );
- yn1 = yn - ( sn - x*cn )/( cn + x*sn );
- if( !_finite( yn1 ) )
- break;
- }while( fabs( yn1 - yn ) >= PRECISION/2.0 );
【责任编辑:
董书 TEL:(010)68476606】