Opened 10 years ago

Closed 10 years ago

Last modified 10 years ago

#6937 closed Bugs (fixed)

Wrong cdf/pdf/quantile domain checks for some probability distributions

Reported by: Florian Schoppmann <Florian.Schoppmann@…> Owned by: John Maddock
Milestone: Boost 1.52.0 Component: math
Version: Boost 1.49.0 Severity: Problem
Keywords: Cc: pbristow@…

Description

students_t_distribution and fisher_f_distribution are affected, and possibly others (have not checked yet).

quantile(const students_t[...]) contains the following code:

   if(false == detail::check_df(
      function, degrees_of_freedom, &error_result, Policy())
         && detail::check_probability(function, probability, &error_result, Policy()))
      return error_result;

quantile(const fisher_f[...]) contains:

   if(false == detail::check_df(
            function, df1, &error_result, Policy())
         && detail::check_df(
            function, df2, &error_result, Policy())
         && detail::check_probability(
            function, p, &error_result, Policy()))
      return error_result;

The code snippets above would only be correct if the "&&" operator had precedence over "==". pdf and cdf contain code of the same form.

Side effects:

  • The Student's t quantile() can be called with a probability outside of [0,1] with unexpected results. Example:
    #include <boost/math/distributions/students_t.hpp>
    using namespace boost::math;
    int main() {
        std::cout << quantile(students_t(1), 2) << std::endl;
    }
    

The output is: -1.84467e+19

  • The Fisher F quantile() function, when called with probability NaN and parameters 1 and 1, leads to a failed BOOST_ASSERT. Example:
    #include <boost/math/distributions/fisher_f.hpp>
    using namespace boost::math;
    int main() {
        quantile(fisher_f(1, 1), std::numeric_limits<double>::quiet_NaN());
    }
    

Change History (5)

comment:1 by John Maddock, 10 years ago

Cc: pbristow@… added
Milestone: To Be DeterminedBoost 1.51.0
Status: newassigned

comment:2 by John Maddock, 10 years ago

Oh dear!

This looks to be a systematic error through all the distributions.

Paul - looks like we need to:

  • Check all the distributions.
  • Add tests for all possible domain errors (including those pesky NaN's - when std::numeric_limits<T>::has_quiet_NaN is true) for all the distros.

comment:3 by John Maddock, 10 years ago

(In [78726]) Improve testing of error conditions and fix any errors detected. Takes care of distributions normal-weibull. Refs #6937.

comment:4 by John Maddock, 10 years ago

Resolution: fixed
Status: assignedclosed

I believe this is now fixed in Trunk.

comment:5 by John Maddock, 10 years ago

Milestone: Boost 1.51.0Boost 1.52.0
Note: See TracTickets for help on using tickets.