NumCpp  2.8.0
A Templatized Header Only C++ Implementation of the Python NumPy Library
factorial.hpp
Go to the documentation of this file.
1 #pragma once
29 
31 #include "NumCpp/Core/Types.hpp"
32 #include "NumCpp/NdArray.hpp"
33 
34 #ifndef NUMCPP_NO_USE_BOOST
35 #include "boost/math/special_functions/factorials.hpp"
36 #endif
37 
38 #include <limits>
39 
40 namespace nc
41 {
42  namespace special
43  {
44  //============================================================================
45  // Method Description:
51  inline double factorial(uint32 inValue)
52  {
53 #ifndef NUMCPP_NO_USE_BOOST
54  if (inValue <= boost::math::max_factorial<double>::value)
55  {
56  return boost::math::factorial<double>(inValue);
57  }
58 
59  return std::numeric_limits<double>::infinity();
60 #else
61  double result = 1.0;
62  for (uint32 i = 2; i <= inValue; ++i)
63  {
64  result *= static_cast<double>(i);
65  }
66 
67  return result;
68 #endif
69  }
70 
71  //============================================================================
72  // Method Description:
78  inline NdArray<double> factorial(const NdArray<uint32>& inArray)
79  {
80  NdArray<double> returnArray(inArray.shape());
81 
83  inArray.cend(),
84  returnArray.begin(),
85  [](uint32 inValue) -> double { return factorial(inValue); });
86 
87  return returnArray;
88  }
89  } // namespace special
90 } // namespace nc
const_iterator cbegin() const noexcept
Definition: NdArrayCore.hpp:1221
Shape shape() const noexcept
Definition: NdArrayCore.hpp:4276
const_iterator cend() const noexcept
Definition: NdArrayCore.hpp:1529
iterator begin() noexcept
Definition: NdArrayCore.hpp:1171
double factorial(uint32 inValue)
Definition: factorial.hpp:51
OutputIt transform(InputIt first, InputIt last, OutputIt destination, UnaryOperation unaryFunction)
Definition: StlAlgorithms.hpp:784
Definition: Coordinate.hpp:45
std::uint32_t uint32
Definition: Types.hpp:40