[spambayes-dev] Mozilla SpamBayes "porting"

Tim Peters tim.one at comcast.net
Thu Feb 19 12:32:46 EST 2004

> Adding the "unsure" category to Mozilla is going to be expensive
> resource-wise, so we've decided to put it off for now.
>   We're going to lump the "unsures" in with the hams.  I'm thinking
> that we'll set the default cutoff at 0.9.

That's OK.  "Unsure" turned out to be a valuable concept for most people, so
don't put it off forever <wink>.

>>> Here's the chi2Q funcition:
>>> static double chi2Q (double x2, double v) {

>> v should be int (OK), or unsigned int (better).

>>>         for (i=1;i<=floor(v/2);i++) {

>> If v is int or unsigned int, you'll also get to skip the relatively
>> expensive floor() call on each loop trip.  You should put in the
>> original code's assert that v is even (this algorithm is dead wrong
>> if v is odd).

> I don't understand how making v an int will make it skip the floor
> function.

v must be an even integer >= 0, therefore there's no need to compute floors;
plain v/2 is always exactly correct when v is even.

> Also, I don't understand what the assert does,

Well, assert() is a standard C function.  If you do

    assert((v & 1) == 0);

then, provided you haven't compiled with NDEBUG #define'd, your program
should die if you ever pass an odd integer for v.

> what does the function return if v is odd?

It shouldn't return anything then:  the program should die!  It's as
senseless to use this function for odd v as it is, e.g., to try to
dereference a NULL pointer.  If the rest of your code is correct, it will
never try to call this function with odd v.  An assert() is a way to catch
this error if the rest of the code isn't correct.  As the comments in the
original code said:

        v must be even.

That's a precondition for using chi2Q; an assert would catch violations of
the precondition; the assert() should never fail; if it does, the code
*calling* chi2Q is in error.

More information about the spambayes-dev mailing list