File: git_issue_1006.cpp

package info (click to toggle)
scipy 1.16.0-1exp7
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 234,820 kB
  • sloc: cpp: 503,145; python: 344,611; ansic: 195,638; javascript: 89,566; fortran: 56,210; cs: 3,081; f90: 1,150; sh: 848; makefile: 785; pascal: 284; csh: 135; lisp: 134; xml: 56; perl: 51
file content (60 lines) | stat: -rw-r--r-- 1,859 bytes parent folder | download | duplicates (6)
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();
}