|
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: Compute the function dev0 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 { 00062 Real dev0(Real const& a, Real const& b) 00063 { 00064 // special values 00065 if (a == 0.) return b; 00066 if (b == a) return 0.; 00067 // ratio 00068 Real v = (a-b)/(a+b); 00069 // small v -> use dl 00070 if (abs(v)<0.125) 00071 { 00072 Real sum = (a-b)*v; 00073 Real ej = 2*a*v; 00074 Real term; 00075 v = v*v; 00076 Integer n =0; 00077 do 00078 { 00079 ej *= v; 00080 sum += (term = (ej/(2*(++n)+1))); 00081 } 00082 while (abs(term) > abs(sum) * Arithmetic<Real>::epsilon()); 00083 return sum; 00084 } 00085 // else compute directly the result 00086 return (a*log(double(a/b))+b-a); 00087 } 00088 00089 } // namespace Funct 00090 00091 } // namespace STK