|
STK++ 1.0
|
00001 /*--------------------------------------------------------------------*/ 00002 /* Copyright (C) 2004-2007 Serge Iovleff 00003 00004 This program is free software; you can redistribute it and/or modify 00005 it under the terms of the GNU Lesser General Public License as 00006 published by the Free Software Foundation; either version 2 of the 00007 License, or (at your option) any later version. 00008 00009 This program is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 GNU Lesser General Public License for more details. 00013 00014 You should have received a copy of the GNU Lesser General Public 00015 License along with this program; if not, write to the 00016 Free Software Foundation, Inc., 00017 59 Temple Place, 00018 Suite 330, 00019 Boston, MA 02111-1307 00020 USA 00021 00022 Contact : Serge.Iovleff@stkpp.org 00023 */ 00024 00025 /* 00026 * Project: Analysis 00027 * Purpose: implementation of the g0 function 00028 * Author: Serge Iovleff, serge.iovleff@stkpp.org 00029 **/ 00030 00035 #include <cmath> 00036 00037 // for Integer and Real 00038 #include "../../STKernel/include/STK_Integer.h" 00039 #include "../../STKernel/include/STK_Real.h" 00040 #include "../../STKernel/include/STK_Misc.h" 00041 00042 #include "../include/STK_Funct_util.h" 00043 00044 namespace STK 00045 { 00046 00047 namespace Funct 00048 { 00061 Real g0(Real const& x) 00062 { 00063 // special values 00064 if (x == 0.) return 1.; 00065 if (x == 1.) return 0.; 00066 // general case 00067 Real v = (x-1.)/(x+1.); 00068 // if 7/9 < x < 9/7 use Taylor serie of log((1+v)/(1-v)) 00069 if (v < 0.125) 00070 { 00071 Real sum = (x-1)*v; 00072 Real ej = 2*x*v; 00073 Real term; 00074 v = v*v; 00075 Integer n =0; 00076 do 00077 { 00078 ej *= v; 00079 sum += (term = (ej/(2*(++n)+1))); 00080 } 00081 while (abs(term) > abs(sum) * Arithmetic<Real>::epsilon()); 00082 return sum; 00083 } 00084 // else compute directly 00085 return x*log(double(x))-x + 1.; 00086 } 00087 00088 } // namespace Funct 00089 00090 } // namespace STK