$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: johnmaddock_at_[hidden]
Date: 2007-06-07 13:36:32
Author: johnmaddock
Date: 2007-06-07 13:36:31 EDT (Thu, 07 Jun 2007)
New Revision: 4485
URL: http://svn.boost.org/trac/boost/changeset/4485
Log:
Added acos, and changed asin to use Halley iteration rather than Newton Raphson.
Text files modified: 
   sandbox/math_toolkit/boost/math/tools/ntl.hpp |    36 ++++++++++++++++++++++++++++++++----    
   1 files changed, 32 insertions(+), 4 deletions(-)
Modified: sandbox/math_toolkit/boost/math/tools/ntl.hpp
==============================================================================
--- sandbox/math_toolkit/boost/math/tools/ntl.hpp	(original)
+++ sandbox/math_toolkit/boost/math/tools/ntl.hpp	2007-06-07 13:36:31 EDT (Thu, 07 Jun 2007)
@@ -278,11 +278,13 @@
    {
       asin_root(NTL::RR const& target) : t(target){}
 
-      std::tr1::tuple<NTL::RR, NTL::RR> operator()(NTL::RR const& p)
+      std::tr1::tuple<NTL::RR, NTL::RR, NTL::RR> operator()(NTL::RR const& p)
       {
-         NTL::RR f0 = sin(p) - t;
+         NTL::RR f0 = sin(p);
          NTL::RR f1 = cos(p);
-         return std::tr1::make_tuple(f0, f1);
+         NTL::RR f2 = -f0;
+         f0 -= t;
+         return std::tr1::make_tuple(f0, f1, f2);
       }
    private:
       NTL::RR t;
@@ -290,7 +292,7 @@
 
    inline NTL::RR asin(NTL::RR z)
    {
-      return boost::math::tools::newton_raphson_iterate(
+      return boost::math::tools::halley_iterate(
          asin_root(z), 
          NTL::RR(std::asin(boost::math::tools::real_cast<double>(z))), 
          NTL::RR(-boost::math::constants::pi<NTL::RR>()/2),
@@ -298,6 +300,32 @@
          boost::math::tools::digits<NTL::RR>());
    }
 
+   struct acos_root
+   {
+      acos_root(NTL::RR const& target) : t(target){}
+
+      std::tr1::tuple<NTL::RR, NTL::RR, NTL::RR> operator()(NTL::RR const& p)
+      {
+         NTL::RR f0 = cos(p);
+         NTL::RR f1 = -sin(p);
+         NTL::RR f2 = -f0;
+         f0 -= t;
+         return std::tr1::make_tuple(f0, f1, f2);
+      }
+   private:
+      NTL::RR t;
+   };
+
+   inline NTL::RR acos(NTL::RR z)
+   {
+      return boost::math::tools::halley_iterate(
+         acos_root(z), 
+         NTL::RR(std::acos(boost::math::tools::real_cast<double>(z))), 
+         NTL::RR(-boost::math::constants::pi<NTL::RR>()/2),
+         NTL::RR(boost::math::constants::pi<NTL::RR>()/2),
+         boost::math::tools::digits<NTL::RR>());
+   }
+
    struct atan_root
    {
       atan_root(NTL::RR const& target) : t(target){}