File indexing completed on 2024-05-12 17:22:36
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 }