Subject | Re: Procedure Problem, Div By 0 |
---|---|
Author | Alexander V.Nevsky |
Post date | 2003-08-07T18:31:16Z |
--- In firebird-support@yahoogroups.com, "andyh20012003"
<andyholcomb@c...> wrote:
always calcualted even if it is clear already will result be true or
false), so your
(ENH.TestedValue != 0) and (ENL.TestedValue != 0)
don't protect you from division by zero in next condition. I can
suggest to remove check for 2% accuracy from query and make this
inside loop execution, something like
For Select
...
Do
if ((EHTestedVal<>0) And (ELTestedVal<>0))
then
if ((((EHTestedVal/ELTestedVal)>0) and
((100 -(EHTestedVal/ELTestedVal)*100) > 2)
)
Or
(((ELTestedVal/EHTestedVal)>0) and
((100 -(ELTestedVal/EHTestedVal)*100) > 2)
)
then
Suspend;
BTW, seems your TestedValue is Double Precision, and compare it with
0 is incorrect, I recommend to use as precision value which can be
treated as zero for your application, like
if ((Abs(EHTestedVal)>PrecVal) And (Abs(ELTestedVal)>PrecVal))
I don't remember have IB5 UDF ABS or not, if not you can write own
or use BETWEEN -PrecVal And PrecVal.
Best regards, Alexander.
<andyholcomb@c...> wrote:
> CREATE PROCEDURE EACHNODE_NETLIST_2:E
> RETURNS (
> EHTESTEDVAL DOUBLE PRECISION,
> EHNODE INTEGER,
> EHSUB INTEGER,
> EHCIR INTEGER,
> ELTESTEDVAL DOUBLE PRECISION,
> ELNODE INTEGER,
> ELSUB INTEGER,
> ELCIR INTEGER)
> AS
> begin
> for
> select ENH.TestedValue,
> ENH.Node,
> ENH.SubstrateNum,
> ENH.CircuitNum,
> ENL.TestedValue,
> ENL.Node,
> ENL.SubstrateNum,
> ENL.CircuitNum
>
> From EachNode ENH, EachNode ENL
>
> Where
> (ENH.JobNum = "2621") and
> (ENH.ProberNum = 1) and
> (ENL.JobNum = "2621") and
> (ENL.ProberNum = 1) and
> ((ENH.Passed = 1) or (ENL.Passed = 1)) and
> (ENH.SubstrateNum = ENL.SubstrateNum ) and
> (ENH.CircuitNum = ENL.CircuitNum) and
> (ENH.Node = 2) and
> (ENL.Node = 92) and
> (
> ((ENH.TestedValue != 0) and (ENL.TestedValue != 0))
> and
> (
> ((ENH.TestedValue/ENL.TestedValue)>0 ) and
> ( (100 -((ENH.TestedValue/ENL.TestedValue)
> *100)) > (100 - 98))
> or(
> (ENL.TestedValue/ENH.TestedValue)>0 ) and
> ( (100 -((ENL.TestedValue/ENH.TestedValue)
> *100)) > (100 - 98))
> )
> )
>
>
> Into :EHTestedval, :EHNode, :EHSub, :EHCir, :ELTestedVal, :ELNode,
> LSub, :ELCirAndy, IB/FB perform complete boolean evaluation (all conditions are
>
> do suspend;
> end
always calcualted even if it is clear already will result be true or
false), so your
(ENH.TestedValue != 0) and (ENL.TestedValue != 0)
don't protect you from division by zero in next condition. I can
suggest to remove check for 2% accuracy from query and make this
inside loop execution, something like
For Select
...
Do
if ((EHTestedVal<>0) And (ELTestedVal<>0))
then
if ((((EHTestedVal/ELTestedVal)>0) and
((100 -(EHTestedVal/ELTestedVal)*100) > 2)
)
Or
(((ELTestedVal/EHTestedVal)>0) and
((100 -(ELTestedVal/EHTestedVal)*100) > 2)
)
then
Suspend;
BTW, seems your TestedValue is Double Precision, and compare it with
0 is incorrect, I recommend to use as precision value which can be
treated as zero for your application, like
if ((Abs(EHTestedVal)>PrecVal) And (Abs(ELTestedVal)>PrecVal))
I don't remember have IB5 UDF ABS or not, if not you can write own
or use BETWEEN -PrecVal And PrecVal.
Best regards, Alexander.