[libcxx] r177826 - Marshall Clow found some divide-by-zero warnings with UBSan in rand's binomial_distribution test. This eliminates the divide-by-zeros and describes in comments the numerical difficulties the test is having. Each of the problematic tests are exploring edge cases of the distribution.

Howard Hinnant hhinnant at apple.com
Sat Mar 23 12:29:46 PDT 2013


Author: hhinnant
Date: Sat Mar 23 14:29:45 2013
New Revision: 177826

URL: http://llvm.org/viewvc/llvm-project?rev=177826&view=rev
Log:
Marshall Clow found some divide-by-zero warnings with UBSan in rand's binomial_distribution test.  This eliminates the divide-by-zeros and describes in comments the numerical difficulties the test is having.  Each of the problematic tests are exploring edge cases of the distribution.

Modified:
    libcxx/trunk/test/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bin/eval.pass.cpp

Modified: libcxx/trunk/test/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bin/eval.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bin/eval.pass.cpp?rev=177826&r1=177825&r2=177826&view=diff
==============================================================================
--- libcxx/trunk/test/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bin/eval.pass.cpp (original)
+++ libcxx/trunk/test/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bin/eval.pass.cpp Sat Mar 23 14:29:45 2013
@@ -177,15 +177,23 @@ int main()
         }
         var /= u.size();
         double dev = std::sqrt(var);
-        skew /= u.size() * dev * var;
-        kurtosis /= u.size() * var * var;
-        kurtosis -= 3;
+        // In this case:
+        //   skew     computes to 0./0. == nan
+        //   kurtosis computes to 0./0. == nan
+        //   x_skew     == inf
+        //   x_kurtosis == inf
+        //   These tests are commented out because UBSan warns about division by 0
+//        skew /= u.size() * dev * var;
+//        kurtosis /= u.size() * var * var;
+//        kurtosis -= 3;
         double x_mean = d.t() * d.p();
         double x_var = x_mean*(1-d.p());
-        double x_skew = (1-2*d.p()) / std::sqrt(x_var);
-        double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
+//        double x_skew = (1-2*d.p()) / std::sqrt(x_var);
+//        double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
         assert(mean == x_mean);
         assert(var == x_var);
+//        assert(skew == x_skew);
+//        assert(kurtosis == x_kurtosis);
     }
     {
         typedef std::binomial_distribution<> D;
@@ -215,15 +223,23 @@ int main()
         }
         var /= u.size();
         double dev = std::sqrt(var);
-        skew /= u.size() * dev * var;
-        kurtosis /= u.size() * var * var;
-        kurtosis -= 3;
+        // In this case:
+        //   skew     computes to 0./0. == nan
+        //   kurtosis computes to 0./0. == nan
+        //   x_skew     == -inf
+        //   x_kurtosis == inf
+        //   These tests are commented out because UBSan warns about division by 0
+//        skew /= u.size() * dev * var;
+//        kurtosis /= u.size() * var * var;
+//        kurtosis -= 3;
         double x_mean = d.t() * d.p();
         double x_var = x_mean*(1-d.p());
-        double x_skew = (1-2*d.p()) / std::sqrt(x_var);
-        double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
+//        double x_skew = (1-2*d.p()) / std::sqrt(x_var);
+//        double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
         assert(mean == x_mean);
         assert(var == x_var);
+//        assert(skew == x_skew);
+//        assert(kurtosis == x_kurtosis);
     }
     {
         typedef std::binomial_distribution<> D;
@@ -333,15 +349,23 @@ int main()
         }
         var /= u.size();
         double dev = std::sqrt(var);
-        skew /= u.size() * dev * var;
-        kurtosis /= u.size() * var * var;
-        kurtosis -= 3;
+        // In this case:
+        //   skew     computes to 0./0. == nan
+        //   kurtosis computes to 0./0. == nan
+        //   x_skew     == inf
+        //   x_kurtosis == inf
+        //   These tests are commented out because UBSan warns about division by 0
+//        skew /= u.size() * dev * var;
+//        kurtosis /= u.size() * var * var;
+//        kurtosis -= 3;
         double x_mean = d.t() * d.p();
         double x_var = x_mean*(1-d.p());
-        double x_skew = (1-2*d.p()) / std::sqrt(x_var);
-        double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
+//        double x_skew = (1-2*d.p()) / std::sqrt(x_var);
+//        double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
         assert(mean == x_mean);
         assert(var == x_var);
+//        assert(skew == x_skew);
+//        assert(kurtosis == x_kurtosis);
     }
     {
         typedef std::binomial_distribution<> D;
@@ -371,15 +395,23 @@ int main()
         }
         var /= u.size();
         double dev = std::sqrt(var);
-        skew /= u.size() * dev * var;
-        kurtosis /= u.size() * var * var;
-        kurtosis -= 3;
+        // In this case:
+        //   skew     computes to 0./0. == nan
+        //   kurtosis computes to 0./0. == nan
+        //   x_skew     == inf
+        //   x_kurtosis == inf
+        //   These tests are commented out because UBSan warns about division by 0
+//        skew /= u.size() * dev * var;
+//        kurtosis /= u.size() * var * var;
+//        kurtosis -= 3;
         double x_mean = d.t() * d.p();
         double x_var = x_mean*(1-d.p());
-        double x_skew = (1-2*d.p()) / std::sqrt(x_var);
-        double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
+//        double x_skew = (1-2*d.p()) / std::sqrt(x_var);
+//        double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
         assert(mean == x_mean);
         assert(var == x_var);
+//        assert(skew == x_skew);
+//        assert(kurtosis == x_kurtosis);
     }
     {
         typedef std::binomial_distribution<> D;
@@ -409,14 +441,22 @@ int main()
         }
         var /= u.size();
         double dev = std::sqrt(var);
-        skew /= u.size() * dev * var;
-        kurtosis /= u.size() * var * var;
-        kurtosis -= 3;
+        // In this case:
+        //   skew     computes to 0./0. == nan
+        //   kurtosis computes to 0./0. == nan
+        //   x_skew     == -inf
+        //   x_kurtosis == inf
+        //   These tests are commented out because UBSan warns about division by 0
+//        skew /= u.size() * dev * var;
+//        kurtosis /= u.size() * var * var;
+//        kurtosis -= 3;
         double x_mean = d.t() * d.p();
         double x_var = x_mean*(1-d.p());
-        double x_skew = (1-2*d.p()) / std::sqrt(x_var);
-        double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
+//        double x_skew = (1-2*d.p()) / std::sqrt(x_var);
+//        double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
         assert(mean == x_mean);
         assert(var == x_var);
+//        assert(skew == x_skew);
+//        assert(kurtosis == x_kurtosis);
     }
 }





More information about the cfe-commits mailing list