blob: d66bf8534b714095bfcd842c3834cda310fdf8ac [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Float object implementation */
33
Guido van Rossum2a9096b1990-10-21 22:15:08 +000034/* XXX There should be overflow checks here, but it's hard to check
35 for any kind of float exception without losing portability. */
36
Guido van Rossumc0b618a1997-05-02 03:12:38 +000037#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038
Guido van Rossum3f5da241990-12-20 15:06:42 +000039#include <ctype.h>
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000040#include "mymath.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041
Guido van Rossum9575a441993-04-07 14:06:14 +000042#ifdef i860
43/* Cray APP has bogus definition of HUGE_VAL in <math.h> */
44#undef HUGE_VAL
45#endif
46
Guido van Rossum9d81b551996-06-26 18:27:19 +000047#if defined(HUGE_VAL) && !defined(CHECK)
Guido van Rossum7fa52f81991-12-16 15:43:14 +000048#define CHECK(x) if (errno != 0) ; \
49 else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
50 else errno = ERANGE
Guido van Rossum9d81b551996-06-26 18:27:19 +000051#endif
52
53#ifndef CHECK
Guido van Rossum7fa52f81991-12-16 15:43:14 +000054#define CHECK(x) /* Don't know how to check */
55#endif
56
Guido van Rossum03093a21994-09-28 15:51:32 +000057#ifdef HAVE_LIMITS_H
58#include <limits.h>
59#endif
60
61#ifndef LONG_MAX
62#define LONG_MAX 0X7FFFFFFFL
63#endif
64
65#ifndef LONG_MIN
66#define LONG_MIN (-LONG_MAX-1)
67#endif
68
Guido van Rossum67ca7011995-02-13 16:38:41 +000069#ifdef __NeXT__
70#ifdef __sparc__
71/*
72 * This works around a bug in the NS/Sparc 3.3 pre-release
73 * limits.h header file.
74 * 10-Feb-1995 bwarsaw@cnri.reston.va.us
75 */
76#undef LONG_MIN
77#define LONG_MIN (-LONG_MAX-1)
78#endif
79#endif
80
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000081#if !defined(__STDC__) && !defined(macintosh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082extern double fmod Py_PROTO((double, double));
83extern double pow Py_PROTO((double, double));
Guido van Rossum6923e131990-11-02 17:50:43 +000084#endif
85
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086PyObject *
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000087#ifdef __SC__
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088PyFloat_FromDouble(double fval)
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000089#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090PyFloat_FromDouble(fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091 double fval;
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000092#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093{
94 /* For efficiency, this code is copied from newobject() */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 register PyFloatObject *op =
96 (PyFloatObject *) malloc(sizeof(PyFloatObject));
Guido van Rossum2a9096b1990-10-21 22:15:08 +000097 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000098 return PyErr_NoMemory();
99 op->ob_type = &PyFloat_Type;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000100 op->ob_fval = fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101 _Py_NewReference(op);
102 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103}
104
Guido van Rossum234f9421993-06-17 12:35:49 +0000105static void
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000106float_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107 PyObject *op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000108{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000109 PyMem_DEL(op);
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000110}
111
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113PyFloat_AsDouble(op)
114 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 PyNumberMethods *nb;
117 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118 double val;
119
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 if (op && PyFloat_Check(op))
121 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000122
123 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
124 nb->nb_float == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126 return -1;
127 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000128
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000130 if (fo == NULL)
131 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 if (!PyFloat_Check(fo)) {
133 PyErr_SetString(PyExc_TypeError,
134 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000135 return -1;
136 }
137
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 val = PyFloat_AS_DOUBLE(fo);
139 Py_DECREF(fo);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000140
141 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142}
143
144/* Methods */
145
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000146void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147PyFloat_AsString(buf, v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148 char *buf;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150{
151 register char *cp;
152 /* Subroutine for float_repr and float_print.
153 We want float numbers to be recognizable as such,
154 i.e., they should contain a decimal point or an exponent.
155 However, %g may print the number as an integer;
156 in such cases, we append ".0" to the string. */
157 sprintf(buf, "%.12g", v->ob_fval);
158 cp = buf;
159 if (*cp == '-')
160 cp++;
161 for (; *cp != '\0'; cp++) {
162 /* Any non-digit means it's not an integer;
163 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000164 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165 break;
166 }
167 if (*cp == '\0') {
168 *cp++ = '.';
169 *cp++ = '0';
170 *cp++ = '\0';
171 }
172}
173
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000174/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000175static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000176float_print(v, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000177 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000178 FILE *fp;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000179 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180{
181 char buf[100];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 PyFloat_AsString(buf, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000184 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185}
186
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188float_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190{
191 char buf[100];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 PyFloat_AsString(buf, v);
193 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194}
195
196static int
197float_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 PyFloatObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000199{
200 double i = v->ob_fval;
201 double j = w->ob_fval;
202 return (i < j) ? -1 : (i > j) ? 1 : 0;
203}
204
Guido van Rossum9bfef441993-03-29 10:43:31 +0000205static long
206float_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 PyFloatObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000208{
209 double intpart, fractpart;
210 int expo;
211 long x;
212 /* This is designed so that Python numbers with the same
213 value hash to the same value, otherwise comparisons
214 of mapping keys will turn out weird */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000215
216#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
217{
218 extended e;
219 fractpart = modf(v->ob_fval, &e);
220 intpart = e;
221}
222#else
Guido van Rossum9bfef441993-03-29 10:43:31 +0000223 fractpart = modf(v->ob_fval, &intpart);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000224#endif
225
Guido van Rossum9bfef441993-03-29 10:43:31 +0000226 if (fractpart == 0.0) {
227 if (intpart > 0x7fffffffL || -intpart > 0x7fffffffL) {
228 /* Convert to long int and use its hash... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 PyObject *w = PyLong_FromDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000230 if (w == NULL)
231 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 x = PyObject_Hash(w);
233 Py_DECREF(w);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000234 return x;
235 }
236 x = (long)intpart;
237 }
238 else {
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000239 /* Note -- if you change this code, also change the copy
240 in complexobject.c */
241 long hipart;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000242 fractpart = frexp(fractpart, &expo);
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000243 fractpart = fractpart * 2147483648.0; /* 2**31 */
244 hipart = (long)fractpart; /* Take the top 32 bits */
245 fractpart = (fractpart - (double)hipart) * 2147483648.0;
246 /* Get the next 32 bits */
247 x = hipart + (long)fractpart + (long)intpart + (expo << 15);
248 /* Combine everything */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000249 }
250 if (x == -1)
251 x = -2;
252 return x;
253}
254
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000255static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256float_add(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000257 PyFloatObject *v;
258 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000260 double result;
261 PyFPE_START_PROTECT("add", return 0)
262 result = v->ob_fval + w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000263 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265}
266
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268float_sub(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 PyFloatObject *v;
270 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000272 double result;
273 PyFPE_START_PROTECT("subtract", return 0)
274 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000275 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000276 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277}
278
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280float_mul(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000281 PyFloatObject *v;
282 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000284 double result;
285
286 PyFPE_START_PROTECT("multiply", return 0)
287 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000288 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290}
291
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293float_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294 PyFloatObject *v;
295 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000297 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000298 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 return NULL;
301 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000302 PyFPE_START_PROTECT("divide", return 0)
303 result = v->ob_fval / w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000304 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000306}
307
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309float_rem(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000310 PyFloatObject *v;
311 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000313 double vx, wx;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000314 double /* div, */ mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000315 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000317 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318 return NULL;
319 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000320 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000321 vx = v->ob_fval;
322 mod = fmod(vx, wx);
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000323 /* div = (vx - mod) / wx; */
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000324 if (wx*mod < 0) {
325 mod += wx;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000326 /* div -= 1.0; */
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000327 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000328 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000329 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330}
331
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000333float_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 PyFloatObject *v;
335 PyFloatObject *w;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000336{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000337 double vx, wx;
338 double div, mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000339 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000340 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000342 return NULL;
343 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000344 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000345 vx = v->ob_fval;
346 mod = fmod(vx, wx);
347 div = (vx - mod) / wx;
348 if (wx*mod < 0) {
349 mod += wx;
350 div -= 1.0;
351 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000352 PyFPE_END_PROTECT(div)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000353 return Py_BuildValue("(dd)", div, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000354}
355
Guido van Rossum363078a1996-05-24 20:45:01 +0000356static double powu(x, n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000357 double x;
358 long n;
359{
360 double r = 1.;
361 double p = x;
362 long mask = 1;
363 while (mask > 0 && n >= mask) {
364 if (n & mask)
365 r *= p;
366 mask <<= 1;
367 p *= p;
368 }
369 return r;
370}
371
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372static PyObject *
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000373float_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 PyFloatObject *v;
375 PyObject *w;
376 PyFloatObject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000377{
378 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000379 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000380 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
381 * The z parameter is really only going to be useful for integers and
382 * long integers. Maybe something clever with logarithms could be done.
383 * [AMK]
384 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000385 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000387 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000388 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000389 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000390 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000391 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000393 ix=fmod(1.0, z->ob_fval);
394 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
395 }
396 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000397 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000399 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000400 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000401 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000402 if (intw > 0)
403 ix = powu(iv, intw);
404 else
405 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000406 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000407 }
408 else {
409 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000410 if (iv == 0.0) {
411 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000413 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000414 return NULL;
415 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000417 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000418 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000420 "negative number to a float power");
421 return NULL;
422 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000423 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000424 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000425 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000426 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000427 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000428 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000429 if (errno != 0) {
430 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000433 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000435 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000436 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
437 if ( ix!=0 &&
438 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
439 ix+=z->ob_fval;
440 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000441 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000442 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444}
445
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447float_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451}
452
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454float_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 Py_INCREF(v);
458 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000459}
460
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000462float_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000463 PyFloatObject *v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000464{
465 if (v->ob_fval < 0)
466 return float_neg(v);
467 else
468 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469}
470
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000471static int
472float_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 PyFloatObject *v;
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000474{
475 return v->ob_fval != 0.0;
476}
477
Guido van Rossum234f9421993-06-17 12:35:49 +0000478static int
Guido van Rossume6eefc21992-08-14 12:06:52 +0000479float_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 PyObject **pv;
481 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000482{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 if (PyInt_Check(*pw)) {
484 long x = PyInt_AsLong(*pw);
485 *pw = PyFloat_FromDouble((double)x);
486 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000487 return 0;
488 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 else if (PyLong_Check(*pw)) {
490 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
491 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000492 return 0;
493 }
494 return 1; /* Can't do it */
495}
496
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000497static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000498float_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000500{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000501 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000502 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
503 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504 PyErr_SetString(PyExc_OverflowError,
505 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000506 return NULL;
507 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000509}
510
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000512float_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000514{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 double x = PyFloat_AsDouble(v);
516 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000517}
518
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000520float_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000522{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000524 return v;
525}
526
527
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000529 (binaryfunc)float_add, /*nb_add*/
530 (binaryfunc)float_sub, /*nb_subtract*/
531 (binaryfunc)float_mul, /*nb_multiply*/
532 (binaryfunc)float_div, /*nb_divide*/
533 (binaryfunc)float_rem, /*nb_remainder*/
534 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000535 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000536 (unaryfunc)float_neg, /*nb_negative*/
537 (unaryfunc)float_pos, /*nb_positive*/
538 (unaryfunc)float_abs, /*nb_absolute*/
539 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000540 0, /*nb_invert*/
541 0, /*nb_lshift*/
542 0, /*nb_rshift*/
543 0, /*nb_and*/
544 0, /*nb_xor*/
545 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000546 (coercion)float_coerce, /*nb_coerce*/
547 (unaryfunc)float_int, /*nb_int*/
548 (unaryfunc)float_long, /*nb_long*/
549 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000550 0, /*nb_oct*/
551 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000552};
553
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554PyTypeObject PyFloat_Type = {
555 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000556 0,
557 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000559 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000560 (destructor)float_dealloc, /*tp_dealloc*/
561 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000562 0, /*tp_getattr*/
563 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000564 (cmpfunc)float_compare, /*tp_compare*/
565 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000566 &float_as_number, /*tp_as_number*/
567 0, /*tp_as_sequence*/
568 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000569 (hashfunc)float_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000570};