File indexing completed on 2024-05-12 05:55:14

0001 /* floatpower.c: power operation, based on floatnum. */
0002 /*
0003     Copyright (C) 2007, 2008 Wolf Lammen.
0004 
0005     This program is free software; you can redistribute it and/or modify
0006     it under the terms of the GNU General Public License as published by
0007     the Free Software Foundation; either version 2 of the License , or
0008     (at your option) any later version.
0009 
0010     This program is distributed in the hope that it will be useful,
0011     but WITHOUT ANY WARRANTY; without even the implied warranty of
0012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013     GNU General Public License for more details.
0014 
0015     You should have received a copy of the GNU General Public License
0016     along with this program; see the file COPYING.  If not, write to:
0017 
0018       The Free Software Foundation, Inc.
0019       59 Temple Place, Suite 330
0020       Boston, MA 02111-1307 USA.
0021 
0022 
0023     You may contact the author by:
0024        e-mail:  ookami1 <at> gmx <dot> de
0025        mail:  Wolf Lammen
0026               Oertzweg 45
0027               22307 Hamburg
0028               Germany
0029 
0030 *************************************************************************/
0031 
0032 #include "floatpower.h"
0033 #include "floatipower.h"
0034 #include "floatcommon.h"
0035 #include "floatlog.h"
0036 #include "floatexp.h"
0037 
0038 char
0039 _raise(
0040   floatnum x,
0041   cfloatnum exponent,
0042   int digits)
0043 {
0044   int iexp;
0045   int extra;
0046 
0047   extra = float_getexponent(exponent);
0048   if (digits + extra > maxdigits)
0049     extra = maxdigits - digits;
0050   if (float_isinteger(exponent))
0051   {
0052     iexp = leadingdigits(exponent, float_getexponent(exponent) + 1);
0053     if (float_iszero(exponent) || iexp !=  0)
0054       return _raisei(x, iexp, digits+extra);
0055   }
0056   if (digits + extra > MATHPRECISION)
0057     extra = MATHPRECISION - digits;
0058   _ln(x, digits+extra);
0059   if (!float_mul(x, x, exponent, digits+extra))
0060     return 0;
0061   return _exp(x, digits);
0062 }