At 03:00 PM 9/9/03 -0500, Liguo Song wrote:
>I noticed the discussion about the 0/0 bug in the 
>TermStructure::zeroCoupon() on the forum at www.Wilmott.com. So, I checked 
>the source code and find that the following code is problematic.
>
>     inline Rate TermStructure::zeroCoupon(Time t, int f,
>         bool extrapolate) const {
>             DiscountFactor df = discountImpl(t, extrapolate);
>             if (f > 0 && t <= (1.0/(double)f))
>                return Rate((1.0/df-1.0)/t);
>             if (t == 0.0)
>                t = 1.0;
>             return Rate((QL_POW(1.0/df,1.0/(t*f))-1.0)*f);
>     }
>
>The "if (t == 0.0) " will never be processed as as t <= 1.0/(double)f is 
>always true when f > 0 and t=0.0. Thus, 0/0 or x/0 will happen as long as 
>f > 0 and t = 0.0.
Hmm. The "if (t == 0.0)" part doesn't make much sense to me either. Why 
change t to 1.0 if 0.0 was requested? Andre', any insight?
>I am just quite curious about why it didn't happen to any compiler other 
>than Borland.
I'm just as puzzled.
>I am not knowledgable enough to offer any remedy here. Anyone up for a patch?
I'd try something like:
     inline Rate TermStructure::zeroCoupon(Time t, int f,
                                          bool extrapolate) const {
         if (t == 0.0)
             return forwardImpl(0.0);
        DiscountFactor df = discountImpl(t, extrapolate);
        if (f > 0 && t <= (1.0/f))
             return Rate((1.0/df-1.0)/t);
         else
            return Rate((QL_POW(1.0/df,1.0/(t*f))-1.0)*f);
     }
Later,
         Luigi