File: git_issue_1006.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (60 lines) | stat: -rw-r--r-- 1,859 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//  (C) Copyright Matt Borland 2023.
//  Use, modification and distribution are subject to the
//  Boost Software License, Version 1.0. (See accompanying file
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#include "math_unit_test.hpp"
#include <cfenv>
#include <iostream>
#include <boost/math/distributions/beta.hpp>

#pragma STDC FENV_ACCESS ON

// Show and then clear the fenv flags
void show_fpexcept_flags()
{
   bool fe = false;

   if (std::fetestexcept(FE_OVERFLOW))
   {
      fe = true;
      std::cerr << "FE_OVERFLOW" << std::endl;
   }
   if (std::fetestexcept(FE_UNDERFLOW))
   {
      //fe = true;
      std::cerr << "FE_UNDERFLOW" << std::endl;
   }
   if (std::fetestexcept(FE_DIVBYZERO))
   {
      fe = true;
      std::cerr << "FE_DIVBYZERO" << std::endl;
   }
   if (std::fetestexcept(FE_INVALID))
   {
      fe = true;
      std::cerr << "FE_INVALID" << std::endl;
   }

   CHECK_EQUAL(fe, false);

   std::feclearexcept(FE_ALL_EXCEPT);
}

int main()
{
   // Default Scipy policy
   using my_policy = boost::math::policies::policy<boost::math::policies::promote_float<false>, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy>;

   double a = 1e-307;

   while (a)
   {
      const auto dist_a = boost::math::beta_distribution<double, my_policy>(1e-308, 5.0);
      const auto dist_a_ppf = boost::math::quantile(dist_a, 0.2);
      show_fpexcept_flags();
      CHECK_MOLLIFIED_CLOSE(dist_a_ppf, 0.0, 1e-10);
      a /= 2;
   }
   return boost::math::test::report_errors();
}