$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r77794 - in sandbox/big_number/libs/multiprecision/example/generic_numerics_examples: . generic_numerics generic_numerics_src
From: e_float_at_[hidden]
Date: 2012-04-06 18:09:09
Author: christopher_kormanyos
Date: 2012-04-06 18:09:09 EDT (Fri, 06 Apr 2012)
New Revision: 77794
URL: http://svn.boost.org/trac/boost/changeset/77794
Log:
Added examples of generic numeric programming using built-in and MP types.
Added:
   sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/   (props changed)
   sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics/   (props changed)
   sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics/generic_numerics.pdf   (contents, props changed)
   sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics_src/   (props changed)
   sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics_src/generic_area_of_a_circle.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics_src/generic_derivative.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics_src/generic_integral.cpp   (contents, props changed)
Added: sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics/generic_numerics.pdf
==============================================================================
Binary file. No diff available.
Added: sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics_src/generic_area_of_a_circle.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics_src/generic_area_of_a_circle.cpp	2012-04-06 18:09:09 EDT (Fri, 06 Apr 2012)
@@ -0,0 +1,45 @@
+#include <boost/math/constants/constants.hpp>
+
+using boost::math::constants::pi;
+
+template<typename T>
+inline T area_of_a_circle(T r)
+{
+  return pi<T>() * (r * r);
+}
+
+#include <iostream>
+#include <iomanip>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using boost::multiprecision::cpp_dec_float_50;
+
+int main(int, char**)
+{
+  const float r_f(float(123) / 100);
+  const float a_f = area_of_a_circle(r_f);
+
+  const double r_d(double(123) / 100);
+  const double a_d = area_of_a_circle(r_d);
+
+  const cpp_dec_float_50 r_mp(cpp_dec_float_50(123) / 100);
+  const cpp_dec_float_50 a_mp = area_of_a_circle(r_mp);
+
+  // 4.75292
+  std::cout
+    << std::setprecision(std::numeric_limits<float>::digits10)
+    << a_f
+    << std::endl;
+
+  // 4.752915525616
+  std::cout
+    << std::setprecision(std::numeric_limits<double>::digits10)
+    << a_d
+    << std::endl;
+
+  // 4.7529155256159981904701331745635599135018975843146
+  std::cout
+    << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10)
+    << a_mp
+    << std::endl;
+}
Added: sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics_src/generic_derivative.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics_src/generic_derivative.cpp	2012-04-06 18:09:09 EDT (Fri, 06 Apr 2012)
@@ -0,0 +1,79 @@
+template<typename value_type,
+         typename function_type>
+value_type derivative(const value_type x,
+                      const value_type dx,
+                      function_type func)
+{
+  // Compute d/dx[func(*first)] using a three-point
+  // central difference rule of O(dx^6).
+
+  const value_type dx1 = dx;
+  const value_type dx2 = dx1 * 2;
+  const value_type dx3 = dx1 * 3;
+
+  const value_type m1 = (  func(x + dx1)
+                         - func(x - dx1)) / 2;
+  const value_type m2 = (  func(x + dx2)
+                         - func(x - dx2)) / 4;
+  const value_type m3 = (  func(x + dx3)
+                         - func(x - dx3)) / 6;
+
+  const value_type fifteen_m1 = 15 * m1;
+  const value_type six_m2     =  6 * m2;
+  const value_type ten_dx1    = 10 * dx1;
+
+  return ((fifteen_m1 - six_m2) + m3) / ten_dx1;
+}
+
+#include <iostream>
+#include <iomanip>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+#include <boost/math/constants/constants.hpp>
+
+using boost::math::constants::pi;
+using boost::multiprecision::cpp_dec_float_50;
+
+int main(int, char**)
+{
+  const float d_f =
+    derivative(float(pi<float>() / 3),
+               0.01F,
+               [](const float x) -> float
+               {
+                 return ::sin(x);
+               });
+
+  const double d_d =
+    derivative(double(pi<double>() / 3),
+               0.001,
+               [](const double x) -> double
+               {
+                 return ::sin(x);
+               });
+
+  const cpp_dec_float_50 d_mp =
+    derivative(cpp_dec_float_50(pi<cpp_dec_float_50>() / 3),
+               cpp_dec_float_50(1.0E-9),
+               [](const cpp_dec_float_50 x) -> cpp_dec_float_50
+               {
+                 return boost::multiprecision::sin(x);
+               });
+
+  // 0.500003
+  std::cout
+    << std::setprecision(std::numeric_limits<float>::digits10)
+    << d_f
+    << std::endl;
+
+  // 0.499999999999888
+  std::cout
+    << std::setprecision(std::numeric_limits<double>::digits10)
+    << d_d
+    << std::endl;
+
+  // 0.50000000000000000000000000000000000000000003925935
+  std::cout
+    << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10)
+    << d_mp
+    << std::endl;
+}
Added: sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics_src/generic_integral.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/example/generic_numerics_examples/generic_numerics_src/generic_integral.cpp	2012-04-06 18:09:09 EDT (Fri, 06 Apr 2012)
@@ -0,0 +1,104 @@
+template<typename value_type,
+         typename function_type>
+inline value_type integral(const value_type a,
+                           const value_type b,
+                           const value_type tol,
+                           function_type func)
+{
+  unsigned n = 1U;
+
+  value_type h = (b - a);
+  value_type I = (func(a) + func(b)) * (h / 2);
+
+  for(unsigned k = 0U; k < 8U; k++)
+  {
+    h /= 2;
+
+    value_type sum(0);
+    for(unsigned j = 1U; j <= n; j++)
+    {
+      sum += func(a + (value_type((j * 2) - 1) * h));
+    }
+
+    const value_type I0 = I;
+    I = (I / 2) + (h * sum);
+
+    const value_type ratio     = I0 / I;
+    const value_type delta     = ratio - 1;
+    const value_type delta_abs = ((delta < 0) ? -delta : delta);
+
+    if((k > 1U) && (delta_abs < tol))
+    {
+      break;
+    }
+
+    n *= 2U;
+  }
+
+  return I;
+}
+
+#include <iostream>
+#include <iomanip>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+#include <boost/math/constants/constants.hpp>
+
+template<typename value_type>
+class cyl_bessel_j_integral_rep
+{
+public:
+  cyl_bessel_j_integral_rep(const unsigned N,
+                            const value_type& X) : n(N), x(X) { }
+
+  value_type operator()(const value_type& t) const
+  {
+    // pi * Jn(x) = Int_0^pi [cos(x * sin(t) - n*t) dt]
+    return cos(x * sin(t) - (n * t));
+  }
+
+private:
+  const unsigned n;
+  const value_type x;
+};
+
+using boost::math::constants::pi;
+typedef boost::multiprecision::cpp_dec_float_50 mp_type;
+
+int main(int, char**)
+{
+  const float j2_f =
+    integral(0.0F,
+             pi<float>(),
+             0.01F,
+             cyl_bessel_j_integral_rep<float>(2U, 1.23F)) / pi<float>();
+
+  const double j2_d =
+    integral(0.0,
+             pi<double>(),
+             0.0001,
+             cyl_bessel_j_integral_rep<double>(2U, 1.23)) / pi<double>();
+
+  const mp_type j2_mp =
+    integral(mp_type(0),
+             pi<mp_type>(),
+             mp_type(1.0E-20),
+             cyl_bessel_j_integral_rep<mp_type>(2U, mp_type(123) / 100)) / pi<mp_type>();
+
+  // 0.166369
+  std::cout
+    << std::setprecision(std::numeric_limits<float>::digits10)
+    << j2_f
+    << std::endl;
+
+  // 0.166369383786814
+  std::cout
+    << std::setprecision(std::numeric_limits<double>::digits10)
+    << j2_d
+    << std::endl;
+
+  // 0.16636938378681407351267852431513159437103348245333
+  std::cout
+    << std::setprecision(std::numeric_limits<mp_type>::digits10)
+    << j2_mp
+    << std::endl;
+}